2012-09-20 12 views
21

मैं एक स्ट्रिंग में एक आयात बयान रख सकते हैं, यह exec, और यह काम करता है (एक यादृच्छिक अंकों प्रिंट): अबपायथन में, फ़ंक्शन में किसी निष्पादन में कोई आयात क्यों नहीं करता है?

code = """ 
import random 
def f(): 
    print random.randint(0,9) 
""" 

def f(): 
    pass 

exec code 
f() 

, अगर मैं अपने खुद के समारोह में exec code और f() रख दिया और यह कहते हैं, ऐसा नहीं काम नहीं करता

def test(): 
    exec code 
    f() 

test() 

यह NameError: global name 'random' is not defined कहता है। कोई विचार क्या चल रहा है? धन्यवाद

+0

जिज्ञासा से, आप ऐसा क्यों करना चाहते हैं? –

+1

यह खराब डिजाइन का संकेत है - इससे बचें। –

+0

+ विन्सेंट सावार्ड, मैं जावा-आधारित उत्पाद के साथ काम करता हूं जो मुझे इसमें पाइथन स्क्रिप्ट लिखने देता है, और जब कुछ निश्चित, पूर्वनिर्धारित घटनाएं होती हैं तो मैं अपनी स्क्रिप्ट को निष्पादित करने के लिए कॉन्फ़िगर कर सकता हूं। हालांकि, अगर मैं लाइब्रेरी के रूप में अपने कार्यों का उपयोग करना चाहता हूं तो मैं अपनी स्क्रिप्ट्स में से किसी एक को लोड करने के लिए मानक आयात कथन का उपयोग नहीं कर सकता। इसके बजाय, मुझे डेटाबेस से उस अन्य स्क्रिप्ट का कोड लोड करना होगा और इसे निष्पादित करना होगा। और समस्या यह है कि दूसरी स्क्रिप्ट जावा लाइब्रेरी आयात करती है जो मैंने नहीं की, जिसमें लाइब्रेरी फ़ंक्शन को कॉल करने वाले मामले में + एलेक्स वर्गा द्वारा वर्णित समस्या का कारण बनता है – Preacher

उत्तर

12

कैसे इस बारे में:

def test(): 
    exec (code, globals()) 
    f() 
3

निर्दिष्ट करें कि आप वैश्विक random मॉड्यूल

code = """ 
import random 
def f(): 
    global random 
    print random.randint(0,9) 
""" 

चाहते समस्या यहाँ है कि आप अपने समारोह गुंजाइश, नहीं वैश्विक क्षेत्र में random मॉड्यूल आयात कर रहे है।

14

यहाँ क्या हो रहा है कि मॉड्यूल यादृच्छिक परीक्षण में एक स्थानीय चर के रूप में आयात किया जा रहा है।

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 कोड में परिभाषित नाम संग्रहीत किया जाता है)।

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

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