python - 使用装饰器将参数传递给 python 函数时出现问题

标签 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 个参数。

我认为这里的问题是装饰器(对此有基本的了解,但不足以解决问题)或 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/

相关文章:

python - 想改进简单的python代码

python - 如何将装饰器中引发的异常传递给装饰函数?

c# - 带有附加依赖的简单注入(inject)器装饰

python - 如何在命令提示符下打印出编码的亚洲字符 (gb2312)?

python - 在 pandas 数据框中使用 .groupby 计算唯一值

python - 从 Celery 结果后端 MYSQL 查询结果

python - 此 Web 应用程序是否需要任务队列?

python - Celery/RabbitMQ unacked 消息阻塞队列?

python - 将装饰器类应用于类方法

python - 解释器关闭时的致命 Python 错误 : could not acquire lock for <_io. BufferedReader name=8>,可能是由于守护线程