2016-08-12 6 views
5

from foo import bar और import foo.bar as bar के बीच क्या अंतर है?पायथन आयात के बारे में स्पष्टीकरण

क्या पाइथन नामस्थान और दायरे से संबंधित कोई अंतर है? यदि आप bar से कुछ उपयोग करना चाहते हैं (whatever नामक फ़ंक्शन कहें), तो आप इसे किसी भी दृष्टिकोण का उपयोग करके bar.whatever() के रूप में कॉल करेंगे।

मैं कोड कोड में आयात की दोनों शैलियों को देखता हूं, जिनके साथ मैं काम कर रहा हूं और सोच रहा था कि वे क्या अंतर करते हैं, यदि कोई हो, और अधिक "पायथनिक" दृष्टिकोण क्या माना जाएगा।

# foo.py 
bar = object() 

यहाँ from foo import bar अजगर में सामान्य होगा, लेकिन import foo.bar as bar एक ImportError: No module named bar उठाएंगे:

उत्तर

4

वहाँ एक अंतर है, दोनों जब वहाँ एक bar मॉड्यूल या foo पैकेज के अंदर पैकेज है के लिए है, और अगर barसभी पर एक मॉड्यूल नहीं है।

माना जाता है निम्नलिखित foo पैकेज: __init__.py फ़ाइल एक वैश्विक नाम barभी को परिभाषित करता है

foo/ 
    __init__.py 
    bar.py 

है, तो पहला उदाहरण कि वस्तु आयात करेगा। दूसरा उदाहरण bar.py मॉड्यूल आयात करेगा।

हालांकि, एक बार foo.bar मॉड्यूल आयात किया गया है, पायथन आयात मशीनरी नाम barfoo पैकेज में सेट हो जाएगा, __init__.py में पहले से मौजूद किसी bar वैश्विक जगह:

$ ls -1 foo/ 
__init__.py 
bar.py 
$ cat foo/__init__.py 
bar = 'from the foo package' 
$ cat foo/bar.py 
baz = 'from the foo.bar module' 
$ python 
Python 2.7.12 (default, Aug 3 2016, 18:12:10) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from foo import bar 
>>> bar 
'from the foo package' 
>>> import foo.bar as bar 
>>> bar 
<module 'foo.bar' from 'foo/bar.pyc'> 
>>> bar.baz 
'from the foo.bar module' 
>>> from foo import bar 
>>> bar 
<module 'foo.bar' from 'foo/bar.pyc'> 

अन्य मामले में जहां है नहींbar.py सबमिशन है। foo या तो एक पैकेज, या एक साधारण मॉड्यूल हो सकता है। उस मामले में from foo import bar हमेशा foo मॉड्यूल में एक वस्तु के लिए दिखाई देगा, और import foo.bar as bar हमेशा असफल हो जायेगी:

$ cat foo.py 
bar = 'from the foo module' 
$ python 
Python 2.7.12 (default, Aug 3 2016, 18:12:10) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import foo 
>>> foo.bar 
'from the foo module' 
>>> from foo import bar 
>>> bar 
'from the foo module' 
>>> import foo.bar as bar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named bar 

ध्यान दें कि सभी मामलों में जहां आयात सफल होता है, तो आप एक वैश्विक नाम barकुछ करने के लिए बाध्य के साथ खत्म, या तो मॉड्यूल से एक ऑब्जेक्ट, या मॉड्यूल ऑब्जेक्ट।

5

जब बार एक मॉड्यूल नहीं है, वहाँ एक बड़ा अंतर है।

आमतौर पर हम केवल नाम के लिए "as" निर्माण का उपयोग करते हैं: या तो पठनीयता में सुधार करने के लिए नाम पर कुछ संदर्भ जोड़ने के लिए, या किसी अन्य नाम से टकराव से बचने के लिए।

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