2012-11-21 27 views
9

मैं एक काम है कि इसअजवाइन कार्य

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' 

कार्य को ठीक से पंजीकृत किया गया है (whi ch पैकेज + मॉड्यूल + समारोह) अगर मैं इस

from mybasetask_module import MyBaseTask 

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

की तरह कार्य करने के लिए एक स्पष्ट नाम प्रदान जब मैं काम से @my_custom_decorator हटाने या इस व्यवहार की उम्मीद है है? क्या मुझे कुछ करने की ज़रूरत है ताकि मेरे कार्यों को पहले मामले में डिफ़ॉल्ट ऑटो पंजीकृत नाम से पंजीकृत किया जा सके जब मेरे पास एकाधिक सजावटी हों लेकिन कोई स्पष्ट कार्य नाम न हो?

धन्यवाद,

उत्तर

22

उपयोग functools.wraps() decorator सुनिश्चित करना है कि आवरण my_custom_decorator द्वारा वापस सही नाम है:

from functools import wraps 

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

कार्य नाम समारोह कॉल से लिया जाता है कि task डेकोरेटर wraps, लेकिन द्वारा बीच में एक सजावट डालने के बाद, आपने task को __inner रैपिंग फ़ंक्शन के बजाय दिया। functools.wraps() सजावट func से सभी आवश्यक मेटाडेटा को रैपर में प्रतिलिपि बनाता है ताकि task() उचित नाम उठा सके।

+2

यह जगह पर था! अब काम करता है स्पष्टीकरण जोड़ने के लिए भी धन्यवाद :)। अब मुझे समझ में आता है। – ksrini

संबंधित मुद्दे