2009-09-15 21 views
32

मैं "प्रोग्रामेटिक" तरीके से ग्लोबल्स को परिभाषित करना चाहता हूं। मुझे क्या करना चाहते करने के लिए कुछ इसी तरह होगा:प्रोग्रामेटिक रूप से वैश्विक (मॉड्यूल) चर सेट कैसे करें?

definitions = {'a': 1, 'b': 2, 'c': 123.4} 
for definition in definitions.items(): 
    exec("%s = %r" % definition) # a = 1, etc. 

विशेष रूप से, मैं एक मॉड्यूल fundamentalconstants कि चर fundamentalconstants.electron_mass के रूप में पहुँचा जा सकता है, आदि, जहां सभी मूल्यों एक फ़ाइल को पार्स के माध्यम से प्राप्त कर रहे हैं (इसमें बनाना चाहते हैं इसलिए "प्रोग्रामेटिक" तरीके से असाइनमेंट करने की आवश्यकता है)।

अब, ऊपर exec समाधान काम करेगा। लेकिन मैं इसके साथ थोड़ा असहज हूं, क्योंकि मुझे डर है कि exec मॉड्यूल ग्लोबल्स सेट करने के लक्ष्य को प्राप्त करने का सबसे साफ तरीका नहीं है।

उत्तर

37

आप शब्दकोश वैश्विक द्वारा दिया() में वैश्विक सेट कर सकते हैं:

definitions = {'a': 1, 'b': 2, 'c': 123.4} 
for name, value in definitions.items(): 
    globals()[name] = value 
+9

+1, चूंकि 'ग्लोबल्स()' वास्तव में संशोधित किया जा सकता है (http://stackoverflow.com/questions/4859217/programmatically-creating-variables-in-python/4859312#4859312)। – EOL

+1

युक्ति: निश्चित रूप से ऊपर उल्लिखित ईओएल के उत्तर को पढ़ें। –

+0

एक और अच्छा मुद्दा सामने आया है कि 'ग्लोबल्स()' में परिवर्तन बिना त्रुटि के बने रहेंगे, लेकिन 'स्थानीय() 'के साथ ऐसी कोई गारंटी नहीं है। – DuckPuncher

4

आप सही हैं, exec आमतौर पर एक बुरा विचार है और यह निश्चित रूप से इस मामले में जरूरत नहीं है।

नेड का जवाब ठीक है। एक अन्य संभावित तरीका यह करने के लिए यदि आप कर रहे हैं एक मॉड्यूल अपने आप को आयात करने के लिए है:

fundamentalconstants.py:

import fundamentalconstants 

fundamentalconstants.life_meaning= 42 

for line in open('constants.dat'): 
    name, _, value= line.partition(':') 
    setattr(fundamentalconstants, name, value) 
+4

मैं इस मॉड्यूल के नाम को हार्डकोड करने के लिए नाडिया के आयात [__ नाम __] 'को प्राथमिकता देता हूं। –

+0

दिलचस्प: मैंने इसके बारे में सोचा नहीं था! यह सच है कि मॉड्यूल फ़ाइल नाम बदलने के खिलाफ यह मजबूत नहीं है, लेकिन यह अभी भी एक दिलचस्प विचार है कि मैं अपने 'exec' को पसंद करता हूं! – EOL

48

यहाँ यह करने के लिए एक बेहतर तरीका है:

import sys 
definitions = {'a': 1, 'b': 2, 'c': 123.4} 
module = sys.modules[__name__] 
for name, value in definitions.iteritems(): 
    setattr(module, name, value) 
+6

शायद आप वर्णन कर सकते हैं कि यह बेहतर क्यों है? – tom10

+9

@ tom10, कोई दस्तावेज गारंटी नहीं है कि _changes_ 'ग्लोबल्स() 'वास्तव में अंतर्निहित मॉड्यूल में परिवर्तनों को जारी रखेगा। यह आज काम करता है, कल तोड़ सकता है। नाडिया का समाधान ओटीओएच ठोस है (इसलिए मेरे द्वारा +1 ;-)। –

+1

मुझे यह करने का तरीका पसंद है, लेकिन स्थानीय() और ग्लोबल्स() के बारे में: वर्तमान दस्तावेज़ों का अर्थ यह है कि यह हमेशा काम करेगा: स्थानीय: वर्तमान स्थानीय प्रतीक तालिका का प्रतिनिधित्व करने वाले शब्दकोश को अपडेट और वापस करें। चेतावनी: इस शब्दकोश की सामग्री को संशोधित नहीं किया जाना चाहिए; परिवर्तन दुभाषिया द्वारा उपयोग किए जाने वाले स्थानीय चर के मानों को प्रभावित नहीं कर सकते हैं। ग्लोबल्स: वर्तमान वैश्विक प्रतीक तालिका का प्रतिनिधित्व करने वाला एक शब्दकोश लौटें। यह हमेशा मौजूदा मॉड्यूल का शब्दकोश है। शायद दस्तावेज़ों को tweaked की जरूरत है ... –

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

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