क्यों पाइथन का eval
फ़ंक्शन के अंदर काम नहीं करता है? एक ही eval(compile(cmd))
कोड वैश्विक वातावरण में काम करता है, लेकिन foo
फ़ंक्शन के अंदर काम नहीं करता है।पायथन eval फ़ंक्शन के अंदर काम नहीं करता
सरल उदाहरण:
fn = '/tmp/tmp'
mode = 'single'
def foo(cmd, fn, mode):
eval(compile(cmd, fn, mode)) # <<< this does not work
print 'foo: cmd=', cmd
print 'foo: x=', x
cmd = "x = 1"
eval(compile(cmd, fn, mode)) # <<< this works
print 'global scope: cmd=', cmd
print 'global scope: x=', x
del(x)
foo('x = 9', fn, mode)
यह आउटपुट और त्रुटि संदेश है:
global scope: cmd= x = 1
global scope: x= 1
foo: cmd= x = 9
foo: x=
Traceback (most recent call last):
File "ctest.py", line 20, in <module>
foo('x = 9', fn, mode)
File "ctest.py", line 12, in foo
print 'foo: x=', x
NameError: global name 'x' is not defined
क्या आप वाकई कुछ करने के लिए अपने मूल्य आवंटित करने के लिए नहीं करना चाहते हैं? –
बस यह कोशिश की: 'x'' लोकल 'dict में समाप्त होता है, जैसा कि यह' exec' के साथ करता है, लेकिन 'exec (cmd)' फ़ंक्शन के भीतर काम करता है, 'eval (compile (...)) ' नहीं करता। –
इसके अलावा, यदि आप 'प्रिंट' में 'x' के बजाय' eval ("x") डालते हैं तो foo: x = ', x' यह भी काम करता है। दोनों में समान व्यवहार, पायथन 2.7 और पायथन 3.4 –