2012-12-13 47 views
5

मैं बहुत सारे कार्यों को लिख रहा हूं जो बहुत समान हैं, और यह जानना चाहते हैं कि बॉयलरप्लेट को कम करने के लिए Task को बेहतर तरीके से कैसे घटाया जाए। चूंकि एक कार्य केवल एक बार स्थापित होता है, इसलिए आप नीचे दिखाए गए __init__ में चीजें नहीं डाल सकते हैं, लेकिन इसे बिंदु को स्पष्ट करना चाहिए।सबक्लासिंग सेलेरी कार्य

class EmailTaskOne(Task): 
    def run(self, object_id): 
     email_data = EmailData.objects.get(pk=object_id) 
     data = self.do_common_stuff(email_data) 
     self.do_unique_stuff(data) 

class EmailTaskTwo(Task): 
    def run(self, object_id): 
     email_data = EmailData.objects.get(pk=object_id) 
     data = self.do_common_stuff(email_data) 
     self.do_unique_stuff2(data) 

# lots more tasks like this 

मैं करना चाहते हैं क्या है:

class BaseEmailTask(Task): 
    abstract = True 
    #...Insert Magic Here... 

class EmailTaskOne(BaseEmailTask): 
    def run(self, object_id): 
     self.do_unique_stuff(self.data) 

तो, के बाद से __init__ सही बाहर है, जहां में मैं सेटअप वर्ग कर

क्या मैं पूरा करने के लिए कोशिश कर रहा हूँ

अमूर्त वर्ग मैं आसानी से कार्यों का एक गुच्छा परिभाषित कर सकता हूं अगर मैं कुछ चीजें करना चाहता हूं तो कुछ चीजें कारक हैं, लेकिन बॉयलरप्लेट के कुछ (बहुत सारे) object_id पर निर्भर करते हैं।

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/6393879/celery-task- तर्क पारित करने के लिए सफल रहा और-कस्टमाइज़-सजावट) – Louis

+0

जबकि समाधान लागू है - सवाल पूछा अलग है। इस तरह, मुझे यह एक डुप्लिकेट नहीं लगता है। यदि मैं मिश्रणों और कार्यों के उत्थान का उपयोग कर अपने कार्यों की सूखापन बढ़ाने की कोशिश कर रहा था - मैं 'सजावट कलेक्टर' की तलाश नहीं करूँगा, लेकिन 'सबक्लास' या 'मिक्सिन' या ऐसा कुछ। – yarbelk

उत्तर

6

क्या मेरा और मौरोरोक्को का जवाब आपकी मदद करता है?

देख celery task and customize decorator

वहाँ मैं एक विस्तारित टास्क

[अजवाइन कार्य और अनुकूलित डेकोरेटर] (की
+0

हालांकि मुझे लिंक प्रतिक्रिया स्वीकार करना पसंद नहीं है, लेकिन यह एक अच्छा जवाब है। संक्षेप में - '__init__' – yarbelk

+0

की बजाय' __call__' विधि को ओवरराइड करें यह मेरे अपने उत्तर का एक लिंक है ... यह यहां भी उपयुक्त है –