Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python芹菜任务画布:SyntaxError:positional参数后跟关键字参数_Python_Python 3.x_Arguments_Celery_Celery Canvas - Fatal编程技术网

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()
返回a
dict
@Matiascercero是的,没有标记提问者,我认为他引用了他的原始帖子,你的答案是正确的我知道,但问题是芹菜链不做**b(),它只做b()!在这种情况下,您可能需要
*b()
,因为
b()
不返回关键字arguments@C.Nivs这个答案是基于原来的问题,它有
b()
返回a
dict
@Matiascercero是的,没有标记提问者,我认为他引用了他的原始帖子,你的答案是正确的