Python芹菜任务画布:SyntaxError:positional参数后跟关键字参数
我有一个芹菜工人运行的任务链。当一个任务完成时,链将该任务的结果作为(位置)参数向前传递到下一个任务。每个任务都有自己的参数+*参数来处理结转参数。问题是我想对任务的参数使用关键字参数,但这些结转参数只是位置参数。下面的代码只是一个简单的示例,用于说明我在不使用芹菜链的情况下遇到的问题:Python芹菜任务画布:SyntaxError:positional参数后跟关键字参数,python,python-3.x,arguments,celery,celery-canvas,Python,Python 3.x,Arguments,Celery,Celery Canvas,我有一个芹菜工人运行的任务链。当一个任务完成时,链将该任务的结果作为(位置)参数向前传递到下一个任务。每个任务都有自己的参数+*参数来处理结转参数。问题是我想对任务的参数使用关键字参数,但这些结转参数只是位置参数。下面的代码只是一个简单的示例,用于说明我在不使用芹菜链的情况下遇到的问题: def test_func(data1,*args): print(data1, '\t', args) def b(): return {'data2':'b'} test_func(d
def test_func(data1,*args):
print(data1, '\t', args)
def b():
return {'data2':'b'}
test_func(data1='a', b())
我知道这会生成“SyntaxError:positional argument following keyword argument”,因为第一个参数使用参数名称,而第二个参数不使用参数名称。
如果我知道如何正确地返回函数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允许在位置参数之后有一个关键字参数,所以一切都顺利运行
感谢@matiascero和@C.Nivs的回答。将函数调用更改为:
test_func('a', b())
在函数定义和调用中,位置参数总是排在第一位
一般来说,顺序如下:
def myfunction(pos1, pos2, *args, **kwargs):
# do things
其中pos1
和pos2
是位置参数。它们没有默认值
*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())
在函数定义和调用中,位置参数总是排在第一位
一般来说,顺序如下:
def myfunction(pos1, pos2, *args, **kwargs):
# do things
其中pos1
和pos2
是位置参数。它们没有默认值
*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()
将您的
测试功能更改为:
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')
将您的测试功能更改为:
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')
我知道。我的问题是我必须这样做。我想知道是否有方法以包含变量名的方式返回b()的结果。@AiDa我不确定我是否理解这个问题,我知道。我的问题是我必须这样做。我想知道是否有方法以包含变量名的方式返回b()的结果。@AiDa我不确定我是否理解这个问题我知道,但问题是芹菜链不做**b(),它只做b()!在这种情况下,您可能需要*b()
,因为b()
不返回关键字arguments@C.Nivs这个答案是基于原来的问题,它有b()
返回adict
@Matiascercero是的,没有标记提问者,我认为他引用了他的原始帖子,你的答案是正确的我知道,但问题是芹菜链不做**b(),它只做b()!在这种情况下,您可能需要*b()
,因为b()
不返回关键字arguments@C.Nivs这个答案是基于原来的问题,它有b()
返回adict
@Matiascercero是的,没有标记提问者,我认为他引用了他的原始帖子,你的答案是正确的