Python celery任务画布:SyntaxError:位置参数紧跟关键字参数

时间:2018-08-15 20:59:56

标签: python python-3.x arguments celery celery-canvas

我有一系列芹菜工人要执行的任务。任务完成后,链将该任务的结果作为(位置)参数转发给下一个任务。每个任务都有自己的参数+ * 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的回答。

2 个答案:

答案 0 :(得分:2)

将您的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')

答案 1 :(得分:1)

将函数调用更改为:

test_func('a', b())

位置args在函数定义和调用中始终排在第一位

通常,顺序如下:

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

其中pos1pos2是位置参数。它们没有默认值。

*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