2012-06-22 19 views
6

मैं इस दायरे व्यवहार के बारे में संदेह में हूँ:अजीब अजगर समारोह गुंजाइश व्यवहार

class Bar: 
    def __init__(self): 
     for fn in ["open","openW","remove","mkdir","exists","isdir","listdir"]: 
      print "register", fn 
      def func_wrapper(filename): 
       print "called func wrapper", fn, filename 
      setattr(self, fn, func_wrapper) 

bar = Bar() 
bar.open("a") 
bar.remove("b") 
bar.listdir("c") 

यह आउटपुट देता है:

register open 
register openW 
register remove 
register mkdir 
register exists 
register isdir 
register listdir 
called func wrapper listdir a 
called func wrapper listdir b 
called func wrapper listdir c 

लेकिन मैं उम्मीद है कि func_wrapper हमेशा सही समारोह होगी। मुझे पता है कि func_wrapper का दायरा पूरे कार्य के लिए है, लेकिन मैं इसे प्रत्येक लूप पुनरावृत्ति में फिर से परिभाषित करता हूं और आखिरी उदाहरण अट्रिब में सहेजा जाता है। मैंने setattr के नीचे func_wrapper = None जोड़ने की भी कोशिश की लेकिन इससे मदद नहीं मिलती (मुझे आश्चर्य भी होगा ...)।

क्या मैं अंधा हूं? मैं वास्तव में यह भी नहीं देखता कि इसे कैसे काम/ठीक करना है।

+0

@heltonbiker: क्या आप विस्तारित कर सकते हैं? मैं इसके बजाय यहां एक निर्देश का उपयोग कैसे करना चाहिए? और क्यों? – Albert

+0

मैंने और अधिक अच्छी तरह से पढ़ा है, और पिछली टिप्पणी हटा दी है। – heltonbiker

उत्तर

6

class Bar: 
    def __init__(self): 
     for fn in ["open","openW","remove","mkdir","exists","isdir","listdir"]: 
      print "register", fn 
      def func_wrapper(filename, fn=fn): 
       print "called func wrapper", fn, filename 
      setattr(self, fn, func_wrapper) 

या, और अधिक मजबूती के साथ साथ या तो,

def mkwrapper(fn): 
    def func_wrapper(filename): 
     print "called func wrapper", fn, filename 
    func_wrapper.__name__ = fn 
    return func_wrapper 

class Bar: 
    def __init__(self): 
     for fn in ["open","openW","remove","mkdir","exists","isdir","listdir"]: 
      print "register", fn 
      func_wrapper = mkwrapper(fn) 
      setattr(self, fn, func_wrapper) 

अपने मूल उदाहरण में के साथ, सभी उत्पन्न कार्यों में एक ही बाहरी चर fn है, जो हर पाश समय में बदल जाता है का उपयोग। सही उदाहरणों में, इसे रोका जाता है।

+0

आह हाँ, मैंने सोचा कि इस तरह sth ... :) – Albert

+0

मैंने हमेशा सोचा था कि देर से बाध्यकारी के संबंध में कुछ * विशेष * 'लैम्ब्डा' के बारे में था, लेकिन अब मैं समझता हूं कि नियमित कार्यों में वास्तव में एक ही समस्या होती है, यह बस वे अक्सर लैम्ब्डा कार्यों के समान तरीके से उपयोग नहीं किए जाते हैं। प्रश्न और उत्तर के लिए +1। –

+0

मैं वास्तव में चाहता हूं कि लोग उस डिफ़ॉल्ट पैरामीटर हैक की सिफारिश करना बंद कर दें। –

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