我正在寻找可归因于芹菜@task
装饰员设置的芹菜任务的正确类型注释。
假设我有一个函数run_task
,可以执行一些芹菜任务。
@task(name='adder')
def add(x, y):
return x + y
def run_task(taskfn: "?", *a, **kw):
# do something here
taskfn.apply_async(args=a, kwargs=kw)
...
>>> run_task(add, 1, 2) # usage
我的困惑在这里:
>>> from celery.task import Task
>>> from celery.local import PromiseProxy
>>> type(add).__name__
'PromiseProxy'
>>> isinstance(add, Task)
False
>>> isinstance(add, PromiseProxy)
True
PromiseProxy
似乎是某种保存任务的“未来”或“承诺”代理(或类似的I haven't looked too far into it)。
这不是问题,我可以轻松完成taskfn: PromiseProxy
,但是taskfn.apply_async
毫无意义,因为apply_async
上没有方法PromiseProxy
。因此,我的问题是,我应该做type
告诉我的事情,还是应该按照鸭子的风格思考并选择Task
?