2010-04-08 11 views
42

मैं फ़ंक्शन के बाहर फ़ंक्शन में परिभाषित स्थानीय चर के समूह का उपयोग करना चाहता हूं। इसलिए मैं वापसी मूल्य में x=locals() पास कर रहा हूं।पायथन: नामस्थान में एक स्ट्रोक में लोड चर

मैं उस शब्दकोश में परिभाषित सभी चर को फ़ंक्शन के बाहर नामस्थान में कैसे लोड कर सकता हूं, ताकि x['variable'] का उपयोग करके मूल्य तक पहुंचने के बजाय, मैं बस variable का उपयोग कर सकता हूं।

+6

यह एक भयानक विचार की तरह लगता है। –

+4

'मॉड्यूल आयात * से' की अवधारणा से कम भयानक है, संभवतः आपको निर्देश है कि आपके पास क्या है। –

+0

@ जोहानलारोय यह एक भयानक विचार क्यों है? –

उत्तर

74

Bunch विकल्प पर विचार करें:

class Bunch(object): 
    def __init__(self, adict): 
    self.__dict__.update(adict) 
तो

अगर आप वाक्य रचना clumsier d['foo'] के बजाय x.foo के साथ एक शब्दकोश d अपने मूल्यों है और (पढ़ें) का उपयोग करना चाहते हैं, बस करो

x = Bunch(d) 

यह अंदर और बाहर दोनों कार्यों में काम करता है - और यह हैdमें इंजेक्शन करने से क्लीनर और सुरक्षित! अजगर के ज़ेन से अंतिम पंक्ति याद रखें ...:

>>> import this 
The Zen of Python, by Tim Peters 
    ... 
Namespaces are one honking great idea -- let's do more of those! 
+9

लेकिन यह बहुत सुरुचिपूर्ण लग रहा है: 'ग्लोबल्स() अपडेट (स्थानीय()) '! (मैं बच्चा, मैं बच्चा) – jathanism

+1

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

+0

यह काम अजगर 3 या उससे ऊपर के लिए करता है? –

14

यह रूप में लंबे समय एक अन्य स्थानीय अंतरिक्ष में एक स्थानीय अंतरिक्ष में चर आयात करने के लिए के रूप में एक वह/वह है क्या के बारे में पता है पूरी तरह से वैध मामला है करते हुए। मैंने इस तरह के कोड को उपयोगी तरीके से कई बार इस्तेमाल किया है। सामान्य वैश्विक अंतरिक्ष को प्रदूषित न करने के लिए सावधान रहना चाहिए।

आप निम्न कर सकते हैं:

adict = { 'x' : 'I am x', 'y' : ' I am y' } 
locals().update(adict) 
blah(x) 
blah(y) 
+0

सहमत हैं, उदाहरण के लिए बहुत सारे PHP टेम्पलेटिंग फ्रेमवर्क स्थानीय नामस्थान में परिवर्तनीय निर्यात का उपयोग करते हैं। – Radek

+10

पायथन दस्तावेज बताता है कि यह एक बुरा विचार है। स्थानीय लोगों() के संबंध में, "इस शब्दकोश की सामग्री को संशोधित नहीं किया जाना चाहिए; परिवर्तन दुभाषिया द्वारा उपयोग किए जाने वाले स्थानीय और निःशुल्क चर के मानों को प्रभावित नहीं कर सकते हैं।" Http://docs.python.org/library/functions.html#locals देखें। –

+3

यह भी देखें: https://youtu.be/Ug0iDjbMPVg?t=47m55s – RobinL

7

एक स्थानीय नेम स्पेस में चर का आयात एक वैध समस्या है और अक्सर templating चौखटे में उपयोग किया।

वापसी एक समारोह से सभी स्थानीय चर:

return locals() 

तो इस प्रकार के रूप में आयात:

r = fce() 
for key in r.keys(): 
    exec(key + " = r['" + key + "']") 
+2

पूरी तरह से काम करता है लेकिन बहुत धीमा है ... हालांकि सरल परीक्षण कार्यक्रमों के लिए कोई समस्या नहीं है। – snowcrash09

0

वहाँ हमेशा इस विकल्प नहीं है, मैं नहीं जानता कि यह है कि यह वहाँ बाहर सबसे अच्छा तरीका है, लेकिन यह निश्चित रूप से काम करता है। मानते हैं कि प्रकार (x) = dict

for key, val in x.items(): # unpack the keys from the dictionary to individual variables 
    exec (key + '=val') 
संबंधित मुद्दे