यहाँ क्या हो रहा है कि मॉड्यूल यादृच्छिक परीक्षण में एक स्थानीय चर के रूप में आयात किया जा रहा है।
def test():
import random
def f():
print random.randint(0,9)
f()
: इस
def test():
exec code
print globals()
print locals()
f()
{'code': '\nimport random\ndef f():\n print random.randint(0,9)\n', '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'test': <function test at 0x02958BF0>, '__name__': '__main__', '__doc__': None}
{'random': <module 'random' from 'C:\Python27\lib\random.pyc'>, 'f': <function f at 0x0295A070>}
कारण f
नहीं देख सकते हैं random
कि f
--if आप ऐसा किया test
के अंदर एक नेस्टेड समारोह नहीं है प्रिंट होगा की कोशिश करो
यह काम करेगा। हालांकि, नेस्टेड फ़ंक्शंस के लिए बाहरी फ़ंक्शन को संकलित करते समय बाहरी फ़ंक्शन में आंतरिक फ़ंक्शन की परिभाषा होती है - ऐसा इसलिए होता है क्योंकि आपको दो चर (बाहरी और आंतरिक) फ़ंक्शंस के बीच साझा किए गए वेरिएबल्स को रखने के लिए सेल चर सेट अप करने की आवश्यकता होती है।
ग्लोबल नेम स्पेस में यादृच्छिक पाने के लिए आपको सिर्फ in
कीवर्ड के बाद exec करने के लिए इस तरह
exec code in globals(),globals()
तर्क कुछ करना होगा वैश्विक और स्थानीय नामस्थान जिसमें कोड निष्पादित होने पर (और इस तरह कर रहे हैं, जहां exec'd कोड में परिभाषित नाम संग्रहीत किया जाता है)।
जिज्ञासा से, आप ऐसा क्यों करना चाहते हैं? –
यह खराब डिजाइन का संकेत है - इससे बचें। –
+ विन्सेंट सावार्ड, मैं जावा-आधारित उत्पाद के साथ काम करता हूं जो मुझे इसमें पाइथन स्क्रिप्ट लिखने देता है, और जब कुछ निश्चित, पूर्वनिर्धारित घटनाएं होती हैं तो मैं अपनी स्क्रिप्ट को निष्पादित करने के लिए कॉन्फ़िगर कर सकता हूं। हालांकि, अगर मैं लाइब्रेरी के रूप में अपने कार्यों का उपयोग करना चाहता हूं तो मैं अपनी स्क्रिप्ट्स में से किसी एक को लोड करने के लिए मानक आयात कथन का उपयोग नहीं कर सकता। इसके बजाय, मुझे डेटाबेस से उस अन्य स्क्रिप्ट का कोड लोड करना होगा और इसे निष्पादित करना होगा। और समस्या यह है कि दूसरी स्क्रिप्ट जावा लाइब्रेरी आयात करती है जो मैंने नहीं की, जिसमें लाइब्रेरी फ़ंक्शन को कॉल करने वाले मामले में + एलेक्स वर्गा द्वारा वर्णित समस्या का कारण बनता है – Preacher