2012-11-21 8 views
9

ich eine Aufgabe hat, die wie diese AufgabeSellerie Aufgabe mit mehreren Dekorateure nicht automatisch Registrierung Aufgabennamen

from mybasetask_module import MyBaseTask 

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

und meine Basis sieht wie folgt aussieht

from celery import task, Task 

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

Das Problem, das ich laufen bin in ist, dass der Sellerie Arbeiter die Aufgabe mit dem Namen

registriert Die Aufgabe ist fein registriert (whi ch ist das Paket + Modul + Funktion), wenn ich entferne @my_custom_decorator von der Aufgabe, oder wenn ich gebe einen eindeutigen Namen für die Aufgabe wie diese

from mybasetask_module import MyBaseTask 

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

Ist dieses Verhalten erwartet? Muss ich etwas tun, damit meine Aufgaben im ersten Fall mit dem automatisch registrierten Standardnamen registriert werden, wenn ich mehrere Dekoratoren, aber keinen expliziten Aufgabennamen habe?

Danke,

Antwort

22

Verwenden Sie die functools.wraps() decorator um sicherzustellen, dass die Verpackung von my_custom_decorator hat den richtigen Namen zurückgegeben:

from functools import wraps 

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

Der Aufgabenname aus dem Funktionsaufruf genommen wird, dass die task Dekorateur Wraps, sondern durch Einfügen eines Dekorators dazwischen, gab Sie stattdessen task Ihre __inner Verpackungsfunktion. Der functools.wraps() Dekorateur kopiert alle notwendigen Metadaten von func zum Wrapper, so dass task() den richtigen Namen aufnehmen kann.

+2

Das war genau richtig! Funktioniert jetzt. Danke für das Hinzufügen der Erklärung auch :). Macht jetzt Sinn für mich. – ksrini

Verwandte Themen