[英]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
其中pos1
和pos2
是位置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.