13

私はこのようなタスクを持っています

from mybasetask_module import MyBaseTask

@task(base=MyBaseTask)
@my_custom_decorator 
def my_task(*args, **kwargs):
    pass

私の基本タスクは次のようになります

from celery import task, Task

class MyBaseTask(Task):
    abstract = True
    default_retry_delay = 10 
    max_retries = 3 
    acks_late = True

私が遭遇している問題は、セロリ労働者が名前でタスクを登録していることです

'mybasetask_module.__inner'

タスクから@my_custom_decoratorを削除した場合、またはこのようにタスクに明示的な名前を指定した場合、タスクは正常に登録されます(package + module + function)。

from mybasetask_module import MyBaseTask

@task(base=MyBaseTask, name='an_explicit_task_name')
@my_custom_decorator 
def my_task(*args, **kwargs):
    pass

この動作は予想されますか?複数のデコレータがあり、明示的なタスク名がない場合、最初のケースでタスクがデフォルトの自動登録名で登録されるように何かをする必要がありますか?

ありがとう、

4

1 に答える 1

29

functools.wraps()デコレータを使用して、によって返されるラッパーmy_custom_decoratorの名前が正しいことを確認します。

from functools import wraps

def my_custom_decorator(func):
    @wraps(func)
    def __inner():
        return func()
    return __inner

タスク名は、デコレータがラップする関数呼び出しから取得されますtaskが、間にデコレータを挿入することで、代わりにラッピング関数を指定しました。デコレータは、必要なすべてのメタデータをからラッパーにコピーして、適切な名前を取得できるようにします。task__innerfunctools.wraps()functask()

于 2012-11-21T11:51:42.643 に答える