Задача сельдерея с несколькими декораторами не автоматическая регистрация имени задачи

У меня есть задача, которая выглядит так:

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'

Задача - registerd fine (которая является пакетом + модуль + функция), когда я удаляю @my_custom_decorator из задачи или если я предоставляю явное имя для задачи, подобной этой

from mybasetask_module import MyBaseTask

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

Ожидается ли такое поведение? Нужно ли мне что-то делать, чтобы мои задачи регистрировались с автоматически зарегистрированным именем по умолчанию в первом случае, когда у меня есть несколько декораторов, но нет явного имени задачи?

Благодаря,

Ответ 1

Используйте декоратор functools.wraps() чтобы убедиться, что обертка, возвращаемая my_custom_decorator имеет правильное имя:

from functools import wraps

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

Название задачи берутся из вызова функции, что task декоратор заворачивает, но вставив декоратор между ними, вы дали task вашей __inner функции оберточной вместо этого. Декоратор functools.wraps() копирует все необходимые метаданные из func в обертку, чтобы task() могла выбрать собственное имя.