簡體   English   中英

Python celery任務畫布:SyntaxError:位置參數緊跟關鍵字參數

[英]Python celery task canvas: SyntaxError: positional argument follows keyword argument

我有一個芹菜工人要執行的任務。 任務完成后,鏈將該任務的結果作為(位置)參數轉發給下一個任務。 每個任務都有自己的參數+ * args來處理結轉的參數。 問題是我想將關鍵字參數用作任務的參數,但是那些結轉參數只是位置參數。 以下代碼只是一個簡單的示例,用於顯示我的問題而不使用芹菜鏈:

def test_func(data1,*args):
    print(data1, '\t', args)

def b():
    return {'data2':'b'}


test_func(data1='a', b())

我知道這會生成“ SyntaxError:位置參數緊跟關鍵字參數”,因為第一個參數使用的是參數名稱,而第二個參數則沒有。

如果我知道如何正確返回函數b()的結果,那么我的問題將得到解決。 也就是說,以調用時將b()視為關鍵字參數的方式返回b()的結果

test_func(data1='a', b())

更新:事實證明芹菜鏈會將每個任務的結果轉移到鏈中下一個任務的第一個參數,而不是最后一個參數。 這對我來說很不好,因為我剛接觸芹菜連鎖店。 因此,我只是切換了位置和關鍵字參數在函數標題中的位置,而我的問題解決如下:

def test_func(data1, data2):
    print(data1, '\t', data2)

def b():
    return 'b'


test_func(b(),data2='a')

由於Python允許在位置參數之后使用關鍵字參數,因此所有內容都可以順利運行。

感謝@MatiasCicero和@ C.Nivs的回答。

將您的test_func更改為:

def test_func(**kwargs):
    # kwargs is a dict containing the keyword arguments
    print(*kwargs)

然后,您可以執行以下操作:

test_func(data1='a', **b())
# Same as doing test_func(data1='a', data2='b')

將函數調用更改為:

test_func('a', b())

位置arg在函數定義和調用中始終排在第一位

通常,順序如下:

def myfunction(pos1, pos2, *args, **kwargs):
    # do things

其中pos1pos2是位置args。 它們沒有默認值。

*args是非關鍵字參數的列表,像

myfunction(pos1, pos2, [1, '2', 333])

**kwargs是關鍵字參數的字典,它們總是倒數第二位:

myfunction(pos1, pos2, [1, '2', 333], {'key':'val'})

編輯:

如果您只是在函數調用中刪除了data1= ,那應該沒問題

>>> test_func('a', b())
a    ({'data2': 'b'},)

如果需要打開包裝,請:

def test_func(data_1, **kwargs):
    print(data_1, '\t', '\t'.join([kwargs[k] for k in kwargs.keys()]))

您可以從b()解壓縮結果

>>> test_func('a', **b())
a    b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM