2010-03-02 37 views
29

पायथन में, import * आयात वास्तव में क्या करता है? क्या यह __init__.py युक्त फ़ोल्डर में मिला है?आयात "आयात *" वास्तव में क्या करता है?

उदाहरण के लिए, from project.model import __init__ घोषित करना आवश्यक है, या from project.model import * पर्याप्त है?

+0

'yadda.yadda import * से' पायथन कमांड लाइन में चीजों पर हैकिंग करते समय सबसे उपयोगी है, उदाहरण के लिए जब आप एक कैलकुलेटर के रूप में पायथन का उपयोग कर रहे हैं और आप बस 'गणित आयात * से टाइप करें'। एक मॉड्यूल में, यह परेशानी के लिए पूछ रहा है। साथ ही, यदि आप एकल-फ़ाइल मॉड्यूल आयात करते हैं (निर्देशिका के विपरीत), 'से ... आयात *' उन प्रतीकों को आयात नहीं करेगा जिनके नाम '_' से शुरू होते हैं। –

उत्तर

38

के रूप में आयात के अन्य रूपों के लिए विरोध from xyz import * की "लाभ" (हाँ, लगभग ... [देखना (क) नीचे] सब कुछ) वर्तमान मॉड्यूल के तहत नामित मॉड्यूल से आयात करता है कि यह सब कुछ है। यह आयातित मॉड्यूल से मॉड्यूल के नाम के साथ उपसर्ग किए बिना विभिन्न ऑब्जेक्ट्स (चर, कक्षाएं, विधियां ...) का उपयोग करने की अनुमति देता है।उदाहरण

>>> from math import * 
>>>pi 
3.141592653589793 
>>>sin(pi/2) 
>>>1.0 

(वर्तमान नाम स्थान में आयात * के) इस अभ्यास के लिए है, लेकिन हतोत्साहित क्योंकि यह यह

  • अवसर नाम स्थान टकराव के लिए प्रदान करता है (कहते हैं कि यदि आप एक चर नाम अनुकरणीय था आयात से पहले)
  • अक्षम हो सकता है, अगर आयातित वस्तुओं की संख्या बड़ी है।
  • स्पष्ट रूप से चर/विधि/वर्ग के मूल दस्तावेज़ नहीं है

आमतौर पर हम इसलिए इस आयात को सीमित (यह इस कोड में भविष्य की यात्रा के लिए कार्यक्रम की "आत्म प्रलेखन" अच्छा है) * तदर्थ परीक्षण और की तरह, और बदले के लिए अभ्यास:

स्पष्ट रूप से कुछ वस्तुओं केवल

>>>from math import pi 
>>>pi 
>>>3.141592653589793 
>>> sin(pi/2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'sin' is not defined 

या आधुनिक आयात आयात अपने स्वयं के नाम स्थान तहत ule (या एक उपनाम क्या है, विशेष रूप से अगर यह एक लंबे नाम है, और कार्यक्रम अपनी वस्तुओं का संदर्भ में कई बार)

>>>import math 
    >>>math.pi 
    >>>3.141592653589793 
    etc.. 


    >>>import math as m #bad example math being so short and standard... 
    >>>m.pi 
    >>>3.141592653589793 
    etc.. 

देखें Python documentation on this topic

(क) विशेष रूप से, from xyz import *
यदि xyz मॉड्यूल __all__ वैरिएबल को परिभाषित करता है, तो यह अनुक्रम में परिभाषित सभी नाम आयात करेगा, अन्यथा यह सभी नाम आयात करेगा, सिवाय इसके कि एक अंडरस्कोर से शुरू होता है।

+7

'एक्स आयात *' का लाभ यह है कि यह आपको आलसी होने की अनुमति देता है। इसकी समस्या यह है कि यह आपको आलसी के लिए गधे में काट देगा :) – voyager

+1

कुछ मॉड्यूल (जैसे ['pygame'] (http://www.pygame.org/docs/ref/locals.html), लेकिन कई अन्य) में एक विशेष सबमिशन है जिसका उद्देश्य '*' के रूप में आयात किया जाना है। इस तरह के विशेष मॉड्यूल आमतौर पर आमतौर पर स्थिरांक या कार्यों का उपयोग किया है। –

+0

तो मूल रूप से मैं नाम स्थान टक्कर के बिना सबकुछ आयात कर सकता हूं यदि मैं 'आयात गणित' का उपयोग गणित आयात * के विपरीत करता हूं? –

3

हाँ, यह करता है। यह आयात करता है (यह एक निजी चर नहीं है, यानी वेरिएबल्स जिनके नाम _ या __ से शुरू होते हैं), और स्थानीय नामस्थान को प्रदूषित करने से बचने के लिए आपको इसे "Properly importing modules in Python" के अनुसार उपयोग न करने का प्रयास करना चाहिए।

यह पर्याप्त है, लेकिन आम तौर पर या तो आप क्या करना चाहिए import project.model, जो पहले से ही __init__.py आयात करता है, "Understanding python imports" प्रति, लेकिन बहुत अधिक शब्दों वाले अगर तुम जब पर बाद में बहुत अधिक है, या import project.model as pm या import project.model as model इसका इस्तेमाल कुछ कीस्ट्रोक को बचाने के लिए प्राप्त कर सकते हैं आप इसका इस्तेमाल करते हैं। में

पालन एलेक्स की सलाह "What exactly does "import *" import?"

+6

अच्छी सिफारिश, लेकिन अपरिचित जानकारी: 'foo import * से ** ** ** ** "सबकुछ आयात नहीं करें" - यह मॉड्यूल की '__all__' विशेषता में सूचीबद्ध नाम आयात करता है, या उस विशेषता को खो देता है, _non-private_ नाम (छोड़कर '_' से शुरू होने वाले नाम)। –

+0

@ एलेक्स, अच्छा बिंदु। क्या आप इसे विस्तारित करना चाहते हैं, या आप इसे पसंद करेंगे? – voyager

+0

मैं पहले से ही इस पर विस्तार कर चुका हूं - इस प्रश्न का मेरा जवाब देखें। –

2

हैं project.model एक पैकेज है, मॉड्यूल import project.model से जाना जाता .../project/model/__init__.py से है। from project.model import *__init__.py के नामस्थान से सब कुछ डंप करता है। यह मॉडल में अन्य मॉड्यूल के साथ स्वचालित रूप से कुछ भी नहीं करता है। पसंदीदा शैली __init__.py के लिए कुछ भी शामिल नहीं है।

कभी भी कभी भी कभी भी import * का उपयोग न करें। यह आपके कोड को अपठनीय और अनजान बनाता है।

1

यदि प्रश्न में मॉड्यूल (project.model आपके मामले में) ने __all__ नामक स्टिंग की एक सूची परिभाषित की है, तो उस सूची में प्रत्येक नामित चर आयात किया जाता है। यदि ऐसा कोई चर नहीं है, तो यह सबकुछ आयात करता है।

10

यह आयात (वर्तमान नामस्थान में) जो भी मॉड्यूल (या पैकेज) को __all__ विशेषता में सूचीबद्ध करता है - इस तरह की एक विशेषता खोना, सभी नाम जो _ से शुरू नहीं होते हैं।

यह ज्यादातर इंटरैक्टिव दुभाषिया सत्रों में उपयोग के लिए एक आसान शॉर्टकट के रूप में लक्षित है: जैसा कि अन्य उत्तरों का सुझाव है, किसी प्रोग्राम में इसका उपयोग न करें।

मेरे सिफारिश, Google's Python style guide प्रति, केवल कभी मॉड्यूल, नहीं वर्ग या कार्य (या अन्य नाम) मॉड्यूल के भीतर से आयात करने के लिए है। स्पष्ट रूप से इसका पालन करने के लिए स्पष्टता और सटीकता के लिए बनाता है, और जब आप "मॉड्यूल के भीतर से सामान" आयात करते हैं तो सूक्ष्म जाल से बचा जाता है।

एक पैकेज (या इसके अंदर से कुछ भी) आयात करना आंतरिक रूप से लोड करता है और पैकेज को __init__.py निष्पादित करता है - वह फ़ाइल पैकेज के शरीर को परिभाषित करती है। हालांकि, यह आपके वर्तमान नामस्थान में __init__ नाम को बाध्य नहीं करता है (इसलिए इस अर्थ में यह उस नाम को आयात नहीं करता है)।

+0

तो मूल रूप से मैं नाम स्थान टक्कर के बिना सबकुछ आयात कर सकता हूं यदि मैं 'आयात गणित' का उपयोग गणित आयात * के विपरीत करता हूं? –

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