खोने वाले पायथन क्लोजर फ़ंक्शन मैंने अभी पाइथन @ सजावट सीखा है, यह अच्छा है, लेकिन जल्द ही मैंने पाया कि मेरा संशोधित कोड अजीब समस्याएं आ रहा है।बाहरी परिवर्तनीय पहुंच
def with_wrapper(param1):
def dummy_wrapper(fn):
print param1
param1 = 'new'
fn(param1)
return dummy_wrapper
def dummy():
@with_wrapper('param1')
def implementation(param2):
print param2
dummy()
मैं इसे डिबग, यह प्रिंट param1
UnboundLocalError: local variable 'param1' referenced before assignment
पर अपवाद बाहर फेंक अगर मैं param1 = 'new'
इस लाइन, इस दिनचर्या निकालने के लिए, किसी भी संशोधित आपरेशन के बिना बाहरी गुंजाइश से चर (नई वस्तु के लिए लिंक) काम कर सकता है
क्या इसका अर्थ है कि मैंने केवल बाहरी स्कोप चर के एक प्रति बनाये हैं, फिर संशोधन करें?
धन्यवाद डेलनान, इसे बंद करना आवश्यक है। यहाँ से संभावना जवाब: What limitations have closures in Python compared to language X closures?
इसी कोड के रूप में:
def e(a):
def f():
print a
a = '1'
f()
e('2')
और यह भी इस पिछले कष्टप्रद वैश्विक चर लगता है:
a = '1'
def b():
#global a
print a
a = '2'
b()
यह द्वारा वैश्विक प्रतीक जोड़ना तय हो गई है। लेकिन बंद करने के लिए, ऐसा कोई प्रतीक नहीं मिला। धन्यवाद unutbu, पायथन 3 हमें nonlocal दिया।
मुझे ऊपर से सीधे बाहरी चर तक पहुंचने से पता है केवल पढ़ने के लिए है। लेकिन यह पहले पढ़ने वाले चर (प्रिंट var) को देखने के लिए असहज है, यह भी प्रभावित है।
की [संभव डुप्लिकेट क्या सीमाएं भाषा एक्स बंद होने की तुलना में पाइथन में बंद हो गया है?] (http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to-language-x-closures) – delnan
यह बिल्कुल है सजावटी बीटीडब्ल्यू के साथ कुछ नहीं करना। – delnan
हां, यह बंद होने में होता है। इस तरह: डीईएफ़ ई (क): डीईएफ़ च(): प्रिंट एक एक = '1' च() ई ('123') –