2013-02-22 40 views
6

अभी मैं इस सरल उदाहरण में जैसे कार्यों उत्पन्न करने के लिए बंद का उपयोग कर रहा:अजगर में बंद के बिना काम करता है उत्पन्न

def constant_function(constant): 
    def dummyfunction(t): 
     return constant 
    return dummyfunction 

ये उत्पन्न कार्यों तो जो उन्हें संग्रहीत करता है एक कस्टम वर्ग के init-विधि के लिए पारित कर रहे हैं उदाहरण के रूप में विशेषताएँ। नुकसान यह है कि कक्षा-उदाहरणों को अचूक बनाता है। इसलिए मैं सोच रहा हूं कि बंद करने से बचने वाले फ़ंक्शन जेनरेटर बनाने का कोई तरीका है या नहीं।

class ConstantFunction(object): 
    def __init__(self, constant): 
     self.constant = constant 
    def __call__(self, t): 
     return self.constant 

def constant_function(constant): 
    return ConstantFunction(constant) 

अपने कार्य को बंद करने राज्य तो एक उदाहरण के लिए स्थानांतरित कर रहा है के बजाय विशेषता:

+0

कॉल करने योग्य कक्षाएं एक विकल्प हो सकती हैं, हालांकि वे अपने स्वयं के चेतावनी और जटिलताओं के सेट के साथ आते हैं। –

उत्तर

8

आप एक प्रतिदेय वर्ग इस्तेमाल कर सकते हैं।

+0

पायथन 3.3 में, एक लैम्ब्डा चुनने से मुझे '_pickle.PicklingError देता है: नहीं ले सकता है: विशेषता लुकअप buildins.function विफल '। (नाम के साथ नियमित कार्यों को चुनना, लेकिन केवल उस फ़ंक्शन के नाम और मॉड्यूल का संदर्भ देता है।) – delnan

+0

@delnan: hrmz, अनाम lambdas को कार्यों की तरह लोड करने योग्य होने की आवश्यकता है, ऐसा प्रतीत होता है। अभी के लिए विकल्प हटा दिया। –

+1

@ डेलनान: यह पता चला है कि मैंने [इस सवाल] को गलत तरीके से पढ़ा है (http://stackoverflow.com/questions/11878300/serializing-and-deserializing-lambdas) और इस प्रकार लगता है कि लैम्बडा काम करेंगे। :-) –

0

नहीं कि मैं सामान्य उपयोग के लिए इसकी अनुशंसा करता हूं ... लेकिन संकलन का एक वैकल्पिक दृष्टिकोण है और exec कोड में है। यह बंद करने के लिए एक समारोह w/o उत्पन्न कर रहा है।

>>> def doit(constant): 
... constant = "def constant(t):\n return %s" % constant 
... return compile(constant, '<string>', 'exec') 
... 
>>> exec doit(1) 
>>> constant(4) 
1 
>>> constant 

कृपया ध्यान दें कि संलग्न समारोह या वर्ग के अंदर यह करने के लिए (अर्थात ग्लोबल नेम स्पेस में) आप भी exec करने के लिए उचित नाम स्थान में पारित करने के लिए की है। देखें: https://docs.python.org/2/reference/simple_stmts.html#the-exec-statement

वहाँ भी डबल lambda दृष्टिकोण है, जो वास्तव में को बंद करने, ठीक है, एक तरह से नहीं है है ...

>>> f = lambda x: lambda y:x 
>>> g = f(1) 
>>> g(4) 
1 
>>> import dill 
>>> _g = dill.dumps(g) 
>>> g_ = dill.loads(_g) 
>>> g_(5) 
1 

आप आप ऐसा, अचार बंद की तरह वस्तुओं की क्षमता के बारे में चिंतित लग रहा था यदि आप dill का उपयोग करते हैं तो भी डबल लैम्बडास अचार कर सकते हैं। कक्षा के उदाहरणों के लिए वही।

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

  • कोई संबंधित समस्या नहीं^_^