2011-02-02 11 views
8

अजगर दस्तावेज में __import__ का एक हिस्सा है, जो मुझे समझ नहीं आता है:पाइथन __import__ फ़ंक्शन में 'ग्लोबल्स` और' लोकल 'पैरामीटर क्या हैं?

__import__(name[, globals[, locals[, fromlist[, level]]]])

समारोह, मॉड्यूल name आयात संभावित दिया globals और locals का उपयोग यह निर्धारित करने के लिए कैसे व्याख्या करने के लिए name एक पैकेज संदर्भ में। मानक कार्यान्वयन इसके locals तर्क का उपयोग नहीं करता है, और आयात विवरण के पैकेज संदर्भ को निर्धारित करने के लिए केवल globals का उपयोग करता है।

मॉड्यूल नाम के बारे में "व्याख्या" करने के लिए क्या है? पैकेज संदर्भ क्या है?

एक उदाहरण कॉल उन मानकों का प्रयोग करके इस तरह दिखता है:

spam = __import__('spam', globals(), locals(), [], -1) 

उदाहरण globals() और locals() कार्य करने के लिए क्यों प्रदान करता है? क्या होता है जब मैं केवल globals() प्रदान करता हूं? या न तो?

मैं शायद मॉड्यूल आयात करने के संबंध में नामस्थान तर्क का कुछ हिस्सा खो रहा हूं। क्या आप मुझे ऐसे लेख में इंगित कर सकते हैं जो इस बारे में बताता है/__import__ फ़ंक्शन के साथ उदाहरण हैं?

+1

इस सवाल StackOverflow करने के लिए ले जाया जा नहीं करना चाहिए? – EOL

+0

यह मजाकिया है, मैंने इसे SO पर लिखना शुरू किया, लेकिन यह सोच रहा था कि मुझे इसे प्रोग्रामर पर पोस्ट करना चाहिए या नहीं। इसके बजाय ... मुझे स्पष्ट रूप से अक्सर पूछे जाने वाले प्रश्नों को देखने की आवश्यकता है ... –

+0

आपको निम्न में से एक उत्तर का चयन करना चाहिए इस प्रश्न के लिए स्वीकार्य उत्तर। आईएमएचओ, 9000 का जवाब मॉड्यूल नेमस्पेस को निर्धारित करने के लिए पाइथन 'ग्लोबल्स' के साथ क्या करता है, यह बताकर सिर पर नाखून को हिट करता है। – Kumba

उत्तर

4

मानक कार्यान्वयन पर अपने सभी locals तर्क का उपयोग नहीं करता है, और केवल import बयान के पैकेज संदर्भ निर्धारित करने के लिए अपने globals उपयोग करता है।

( docs.python.org से)

मैं अभी भी पता नहीं कैसे globals उपयोग किया जाता है है; import कथन का तरीका किस वैश्विक चर को कभी प्रभावित कर सकता है?

संपादित करें: अजगर 2.5 स्रोत में import.c को देखने के बाद मैंने पाया कि __import__ आदेश बढ़ाने के लिए पथ (रों) इन चरों में से एक में पाया करने के लिए आयात खोज पथ रिश्तेदार में या तो __name__ या __path__globals में मिल जाने की उम्मीद, उस क्रम में।

+0

उलझन के बारे में बात करें। तो मूल रूप से, सभी ग्लोबल्स के आस-पास स्मृति के इस बड़े पैमाने पर ब्लॉब को पार करने के बजाय (मान लीजिए कि पाइथन संदर्भ द्वारा ऐसा नहीं करता है), कोई भी एक कुंजी को एक कुंजी, '__name __ "' के साथ सरल कर सकता है, कॉलिंग मॉड्यूल पर सेट किया गया है '__name__' विशेषता, और पायथन इसके साथ काम करेगा। पायथन दस्तावेज जानकारी के इस tidbit के साथ अद्यतन किया जाना चाहिए। – Kumba

+0

@ कुम्बा: मान लीजिए कि पाइथन कुछ प्राचीन संख्यात्मक संचालन को छोड़कर, संदर्भ द्वारा सबसे अधिक सब कुछ करता है। संदर्भ निश्चित रूप से संदर्भ द्वारा पारित कर रहे हैं। पायथन 3.3 भी उन चीजों के कार्यान्वयन को प्रस्तुत करता है जो कुंजी साझा करते हैं, यानी, कुंजी को संदर्भ द्वारा भी एक्सेस किया जाता है। यदि आप गड़गड़ाहट करना चाहते हैं तो कैश समेकन के बारे में बात करें :) – 9000

+0

वास्तव में गैर-कैश-सुसंगत हार्डवेयर पर (और स्वामित्व) चलाने के बाद, मैं केवल उस दुःस्वप्न की कल्पना करना शुरू कर सकता हूं। शुक्र है (या दुख की बात है, अपना पिक लें), पायथन में मैंने जो कोड लिखा है, कम से कम, पायथन 2.4 पर चलना है। मैंने 3.x से परहेज किया है क्योंकि मुझे पता है कि यह पूरी तरह से भाषा को समाप्त कर चुका है और मेरा बहुत सारे कोड शायद गंभीर पुन: लिखने के लिए काम नहीं करेगा। – Kumba

0

क्या है मॉड्यूल का नाम के बारे में "व्याख्या" के लिए? पैकेज संदर्भ क्या है?

जब आप

>>> a 

दर्ज अजगर "व्याख्या" उस नाम होना आवश्यक है। क्या यह वैश्विक है? क्या यह एक स्थानीय है?

>>> def f(x): 
... return x * a 

अब, x स्पष्ट रूप से स्थानीय है। a को "व्याख्या" किया जाना है। ग्लोबल? स्थानीय?

उदाहरण ग्लोबल्स() और स्थानीय() फ़ंक्शन में क्यों प्रदान करता है? क्या होता है जब मैं केवल ग्लोबल्स() प्रदान करता हूं?या न तो?

यह प्रयास करें और देखें। गंभीरता से। पूछने के लिए इसके साथ खेलना आसान है।

क्या महत्वपूर्ण है कि चीजें आप >>> प्रॉम्प्ट पर कर वैश्विक हो रहा है।

आपको उन कार्यों को परिभाषित करने की आवश्यकता होगी जो स्थानीय संदर्भ बनाएंगे ताकि आप वैश्विक और स्थानीय के बीच अंतर देख सकें।

+0

ठीक है, मैं थोड़ा सा खेलूँगा :) –

+0

गंभीर^डब्ल्यू मजाकिया सच यह है कि आयातित मॉड्यूल मॉड्यूल के लगभग वैश्विक मूल्यों को अनदेखा करता है जो आयात करता है, और '__import__' पूरी तरह से 'स्थानीय' पैरामीटर को अनदेखा करता है। अन्यथा, आप सही हैं :) – 9000

1

globals जहां आयात बुलाया जा रहा है पर वर्तमान संदर्भ निर्धारित करने के लिए प्रयोग किया जाता है। उदाहरण के लिए:

""" 
/myproject/a/b.py 
/myproject/a/foo.py 
/myproject/c/d.py 
/myproject/c/foo.py 
""" 

# Which foo gets imported? 

import foo #1 
foo = __import__('foo') #2 

वे एक ही है, क्योंकि वहाँ कोई (आसान) # 2 पर जिस तरह से पता करने के लिए जो मॉड्यूल से आयात से बुलाया जा रहा है नहीं कर रहे हैं। __import__ फ़ंक्शन को यह जानने की आवश्यकता है कि वर्तमान मॉड्यूल वास्तव में सही foo आयात करने के लिए कौन सा मॉड्यूल है।

आंतरिक रूप से __import__(), globals पर आयात करने वाले मौजूदा मॉड्यूल पर संदर्भ प्राप्त करने के लिए उपयोग किया जाता है। । __import__source code से: अगर वैश्विक

वापसी पैकेज है कि एक आयात में प्रदर्शन किया जा रहा है मॉड्यूल foo.bar.bat (अपने आप में एक पैकेज नहीं), इस के लिए sys.modules प्रविष्टि रिटर्न से आता है foo.bar। यदि ग्लोबल्स पैकेज के init से हैं .py, एक उधार संदर्भ के रूप में sys.modules में पैकेज की प्रविष्टि लौटा दी जाती है।

+0

मान लें कि 'b.py' और' d.py' में 'आयात foo' है। पाइथन को कैसे पता चलेगा कि कौन सा आयात करना है? 'B.py' के मामले में, यह' ../c'/ में 'foo' क्यों दिखता है? –

+0

यदि '/ myproject/e.py' में 'import foo' है, तो उसे कोई काम नहीं करना चाहिए। या तो 'a.foo' आयात करें या 'आयात c.foo' आयात करें। मुझे खेद है ... मैं ऐसा उदाहरण नहीं प्रतीत कर सकता हूं जो "परेशानी का कारण" होगा, क्या आप मुझे संकेत दे सकते हैं? –

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