【问题标题】:Python celery task canvas: SyntaxError: positional argument follows keyword argumentPython celery 任务画布:SyntaxError:位置参数跟随关键字参数
【发布时间】:2019-01-22 18:47:03
【问题描述】:

我有一个芹菜工人运行的一系列任务。当任务完成时,链将该任务的结果作为(位置)参数转发到下一个任务。每个任务都有自己的参数 + *args 来处理结转的参数。问题是我想为任务的参数使用关键字参数,但那些结转的参数只是位置参数。下面的代码只是一个简单的例子来展示我不使用芹菜链的问题:

def test_func(data1,*args):
    print(data1, '\t', args)

def b():
    return {'data2':'b'}


test_func(data1='a', b())

我知道这会生成“语法错误:位置参数跟随关键字参数”,因为第一个参数使用的是参数名称,而第二个没有。

如果我知道如何正确返回函数 b() 的结果,那么我的问题就迎刃而解了。也就是说,在调用时以将 b() 视为关键字参数的方式返回 b() 的结果

test_func(data1='a', b())

更新: celery 链将每个任务的结果传递到链中下一个任务的第一个参数,而不是最后一个参数。这是我的坏事,因为我是芹菜链的新手。因此,我只是在函数头中切换了位置参数和关键字参数的位置,我的问题得到了如下解决:

def test_func(data1, data2):
    print(data1, '\t', data2)

def b():
    return 'b'


test_func(b(),data2='a')

由于 Python 允许在位置参数之后有一个关键字参数,因此一切都可以顺利运行。

感谢@MatiasCicero 和@C.Nivs 的回答。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我知道这一点,但问题是 celery-chain 不做 **b() 它只做 b()!
    • 在这种情况下您可能需要*b(),因为b() 不返回关键字参数
    • @C.Nivs 这个答案是基于原来的问题,b() 返回一个dict
    • @MatiasCicero 是的,没有标记提问者,我认为他引用了他的原始帖子,你的答案是正确的
    【解决方案2】:

    将您的函数调用更改为:

    test_func('a', b())
    

    位置参数在函数定义和调用中总是排在第一位

    一般来说,顺序是这样的:

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

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

    *args是一个非关键字参数列表,传入like

    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
    

    【讨论】:

    • 我知道。我的问题是我必须这样做。我想知道是否有办法以包含变量名的方式返回 b() 的结果。
    • @AiDa 我不确定我是否理解这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2019-04-23
    相关资源
    最近更新 更多