我有以下代码,导致此错误:
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 个参数。
我认为这里的问题是装饰器(对此有基本的了解,但不足以解决问题)或 subtask celery 中的函数。
我没有足够的Python知识来真正继续......任何人都可以告诉我发生了什么以及如何将字典传递给smallTask函数吗?
最佳答案
您需要在 args
中传递子任务的参数关键字参数,它必须是根据 celery.subtask()
documentation 的元组:
subtask('smallTask', args=(obj,)).apply_async()
或使用 Task.subtask()
方法您的 smallTask
任务,但再次将参数作为元组传递:
smallTask.subtask((obj,)).apply_async()
或者,将星号参数与 Task.s()
method 一起使用:
smallTask.s(obj).apply_async()
subtasks documentation您自己链接到在示例中使用元组;参数和关键字参数是 Celery 必须为您存储的两条数据,直到它可以运行该任务,然后它将为您应用这些参数和关键字参数。
但是celery.subtask()
函数不仅仅需要任务的参数和关键字参数;它还需要额外的选项。为了在您的任务中使用任意参数(位置或关键字),并且支持未传递给您的任务的其他参数,函数签名别无选择,只能接受位置参数作为显式元组,并将关键字参数作为显式字典。
Task.s()
方法不接受除任务本身接受之外的任何参数,因此它支持传递参数,就像直接调用任务一样。在内部,这使用了包罗万象的参数:Task.s(*args, **kwarg)
,并将捕获的参数作为元组和字典传递给 Task.subtask()
.
关于python - 使用装饰器将参数传递给 python 函数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17593273/