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