使用装饰器将参数传递给python函数的问题

时间:2013-07-11 12:22:19

标签: python celery decorator python-decorators

我有以下代码,导致此错误:

TypeError('smallTask() takes exactly 1 argument (2 given)',)

@task
def master():
    count = 0
    obj = { 'var1':'val1', 'var2':'val2' }

    while count < 10:
        subtask('smallTask',obj).apply_async()
        count += 1

@task(name='smallTask')
def smallTask(obj):
    print obj

将字典传递给函数,我想我需要使用** kwargs但是如果我这样做,我会得到错误,该函数没有参数,但是已经提供了2。

我认为这里的问题是装饰者(对此基本了解但不足以解决问题)或Celery中的subtask函数。

我没有足够的python知识来真正继续..有没有人能让我知道发生了什么以及如何将smallTask​​函数传递给字典?

1 个答案:

答案 0 :(得分:5)

您需要在args关键字参数中传递子任务的参数,该参数必须是根据celery.subtask() documentation的元组:

subtask('smallTask', args=(obj,)).apply_async()

或使用Task.subtask()方法 on smallTask任务,但再次将参数作为元组传递:

smallTask.subtask((obj,)).apply_async()

或者,将星号参数与Task.s() method

一起使用
smallTask.s(obj).apply_async()

你自己链接的subtasks documentation使用示例中的元组;参数和关键字参数是Celery必须为您存储的两个数据,直到它可以运行该任务,然后它将为您应用这些参数和关键字参数。

但是celery.subtask()函数不仅仅需要你的任务的参数和关键字参数;它还需要额外的选择。为了使用任意参数(位置或关键字)来完成任务,支持 not 传递给您的任务的其他参数,函数签名别无选择,只能接受位置参数作为显式元组,并将关键字参数作为显式字典。

Task.s()方法不接受任务本身接受的任何参数,因此它支持传递参数,就像直接调用任务一样。在内部,它使用catch-all参数:Task.s(*args, **kwarg),并将捕获的参数作为元组和字典传递给Task.subtask()