2009-07-27 7 views
48

मान लीजिए कि मेरे पास अपेक्षाकृत लंबा मॉड्यूल है, लेकिन केवल एक बार बाहरी मॉड्यूल या विधि की आवश्यकता है।पायथन में अच्छा या बुरा अभ्यास: फ़ाइल के बीच में आयात करें

क्या यह मॉड्यूल के मध्य में उस विधि या मॉड्यूल को आयात करने के लिए ठीक माना जाता है?

या import केवल मॉड्यूल के पहले भाग में होना चाहिए।

उदाहरण:

import string, pythis, pythat 
... 
... 
... 
... 
def func(): 
    blah 
    blah 
    blah 
    from pysomething import foo 
    foo() 
    etc 
    etc 
    etc 
... 
... 
... 

कृपया अपने उत्तर का औचित्य साबित और PEP या प्रासंगिक स्रोतों

+0

की संभावित डुप्लिकेट [अजगर - अगर में आयात] (http://stackoverflow.com/questions/12860841/python-import-in-if) – Abhijeet

उत्तर

48

PEP 8 आधिकारिक राज्यों:

आयात हमेशा की तरह, फ़ाइल के शीर्ष पर रखा जाता है तो बस किसी भी मॉड्यूल के बाद टिप्पणियों और docstrings, और मॉड्यूल वैश्विक और स्थिरांक से पहले।

पीईपी 8, किसी भी "घर में" शैली गाइड के आधार पर होना चाहिए, क्योंकि यह का सार देता क्या कोर अजगर टीम सबसे प्रभावी शैली, समग्र (और निश्चित रूप से अलग-अलग असहमति के साथ होने के लिए मिल गया है, के रूप में पर कोई अन्य भाषा, लेकिन आम सहमति और बीडीएफएल पीईपी 8 पर सहमत हैं)।

+1

एलेक्स: यह "सर्वोत्तम अभ्यास" है लेकिन हमेशा से बचने योग्य नहीं है। मैंने जो उदाहरण दिया है उसे देखें। – jkp

+0

@jkp, S.Lott ने आपके उत्तर पर टिप्पणी की और दिखाया कि यह उस उदाहरण में क्यों टालने योग्य है। एकमात्र उदाहरण जो मैं सोच सकता हूं, गतिशील रूप से जेनरेट किए गए मॉड्यूल नामों का उपयोग करेगा, इस प्रकार '__import__', सादे आयात नहीं - * उन * मामलों में जिन्हें आप तब तक आयात नहीं कर सकते जब तक आप आयात करने वाले मॉड्यूल का नाम नहीं जानते, लेकिन फिर आप उस पर एक सादा 'आयात' का उपयोग नहीं कर रहे हैं। –

+0

@ एसएलओटी "नीचे" :) – Draemon

7

यह फ़ाइल के शुरू में समूह के लिए "अच्छी फार्म" माना जाता है सभी आयातों एक साथ करने के लिए लिंक जोड़ने ।

मॉड्यूल अन्य मॉड्यूल आयात कर सकते हैं। यह परंपरागत है लेकिन मॉड्यूल (या स्क्रिप्ट, उस मामले के लिए) की शुरुआत में सभी आयात विवरणों को रखने की आवश्यकता नहीं है। आयातित मॉड्यूल नाम आयात मॉड्यूल की वैश्विक प्रतीक तालिका में रखे जाते हैं।

यहाँ से: http://docs.python.org/tutorial/modules.html

8

यह आम तौर पर खराब व्यवहार का माना जाता है, लेकिन कभी कभी यह अपरिहार्य है (जैसे कि आप एक परिपत्र आयात से बचने के लिए जब)।

एक समय का एक उदाहरण जब आवश्यक हो: मैं अपने सभी कोड बनाने के लिए Waf का उपयोग करता हूं। सिस्टम टूल्स में विभाजित है, और प्रत्येक उपकरण को अपने मॉड्यूल में लागू किया जाता है। प्रत्येक उपकरण मॉड्यूल एक detect() विधि को यह पता लगाने के लिए प्रत्यारोपित कर सकता है कि पूर्व-आवश्यकताएं मौजूद हैं या नहीं। इनमें से एक का उदाहरण निम्न कार्य कर सकता है:

def detect(self): 
    import foobar 

यदि यह सही तरीके से काम करता है, तो उपकरण उपयोग योग्य है। फिर बाद में उसी मॉड्यूल में foobar मॉड्यूल की आवश्यकता हो सकती है, इसलिए आपको फ़ंक्शन स्तरीय दायरे पर इसे फिर से आयात करना होगा। स्पष्ट रूप से अगर यह मॉड्यूल स्तर पर आयात किया गया था चीजें पूरी तरह से उड़ा देंगे।

+8

आयात डीईएफ़ के अंदर निश्चित रूप से परिहार्य है। हम 'कोशिश करें: आयात एक्स का उपयोग करें; सभी आयातों को सामने रखने के लिए ImportError 'तर्क ब्लॉक को छोड़कर। –

+0

मैंने विशेष रूप से परिपत्र आयात के बारे में हिस्सा दिया है, हालांकि मैं पीईपी 8 के बारे में हर किसी के जवाब से सहमत हूं। निश्चित रूप से, परिपत्र आयात तय किया जा सकता है और तय किया जाना चाहिए, लेकिन यह एक बेकार प्रयास हो सकता है।इसलिए, आपके समय के साथ मूल्य लाने के हित में, एक इनलाइन आयात स्वीकार्य है यदि ए) इनलाइन आयात से बचने के लिए आवश्यक परिवर्तन कुछ लाइव सेवा के लिए अत्यधिक जोखिम भरा हैं, और | या बी) परिपत्र आयात को ठीक करने से कोई मूल्य नहीं आता है अंतिम उपयोगकर्ता (लंबे समय तक पुन: रखरखाव सहित)। शायद, सी भी) क्योंकि यह बहुत लंबा लगता है और संदिग्ध मूल्य है। – ThatsAMorais

10

यदि आयातित मॉड्यूल का बार-बार उपयोग किया जाता है और आयात महंगा होता है, तो मध्य-आयात ठीक है।

अन्यथा, एलेक्स मार्टेलि के सुझाव का पालन करना बुद्धिमानी है।

2

PEP8:

आयात हमेशा की तरह, फ़ाइल के शीर्ष पर रखा जाता है तो बस किसी भी मॉड्यूल के बाद टिप्पणियों और docstrings, और मॉड्यूल वैश्विक और स्थिरांक से पहले।

स्कॉप्ड आयात करने के लिए यह बुरा अभ्यास नहीं है। ताकि आयात केवल आपके द्वारा उपयोग किए जाने वाले फ़ंक्शन पर लागू हो।

मुझे लगता है कि कोड अधिक पठनीय होगा हालांकि आयात जहां ब्लॉक के शीर्ष पर एक साथ समूहित किया गया हो या यदि आप इसे विश्व स्तर पर शीर्ष पर चाहते हैं फ़ाइल।

2

ठीक है, मुझे लगता है कि समूह के लिए एक अच्छा अभ्यास है सभी आयातों एक साथ फ़ाइल के बाद से हर कोई जानता है शुरू में जहां अगर पता करने के लिए जो libs

15

लोड किए गए हैं वहाँ पर इस विषय की विस्तृत चर्चा था चाहते हैं देखने के लिए 2001 में अजगर मेलिंग सूची: समय की

https://mail.python.org/pipermail/python-list/2001-July/071567.html

+3

पर "यह कोड कहाँ रहना चाहिए" पर देखें, "पीईपी 8 कहता है" के बजाय चर्चा के लिंक प्रदान करने के लिए इसे ऊपर उठाएं इसलिए"। मैं कहूंगा कि इसका "मांस" थ्रेड में कई संदेश शुरू करता है (http://mail.python.org/pipermail/python-list/2001-July/097866.html)। –

+5

उपरोक्त लिंक मर चुके हैं, लेकिन यह काम करने लगता है: https://mail.python.org/pipermail/python-list/2001-July/071567.html कुछ चर्चा हटा दी जा सकती है। – jtpereyda

+2

यह एक लिंक-केवल उत्तर है और सहायक नहीं है। इसके बजाय यहां अपने उत्तर का मांस रखो। – Jess

6

95%, आप फ़ाइल के शीर्ष पर अपने सभी आयात रखना चाहिए। एक मामला जहां आप एक समारोह-स्थानीय आयात करना चाहते हैं, यदि आपको सर्कुलर आयात से बचने के लिए ऐसा करना है। कहें f.py.py आयात करता है, और bar.py में एक फ़ंक्शन foo.py से कुछ आयात करने की आवश्यकता है। यदि आप अपने सभी आयात शीर्ष पर डालते हैं, तो आपको उन फ़ाइलों पर आयात करने में अप्रत्याशित समस्याएं हो सकती हैं जो अभी तक संकलित नहीं की गई जानकारी पर निर्भर हैं। इस मामले में, स्थानीय फ़ंक्शन स्थानीय आयात करने से आपके कोड को अन्य मॉड्यूल को आयात करने की अनुमति मिल सकती है जब तक कि उसका कोड पूरी तरह से संकलित नहीं हो जाता है, और आप प्रासंगिक फ़ंक्शन को कॉल करते हैं।

हालांकि, ऐसा लगता है कि आपका उपयोग-केस यह स्पष्ट करने के बारे में अधिक है कि foo() कहां से आ रहा है। इस मामले में, मैं अब तक दो चीजों में से एक पसंद करेंगे:

सबसे पहले, के बजाय

from prerequisite import foo 

आयात शर्त सीधे, और बाद में prerequisite.foo ही कहते हैं। अतिरिक्त वर्बोजीटी कोड कोड पारदर्शिता के माध्यम से खुद को हुकुम में वापस भुगतान करती है।

वैकल्पिक रूप से, (या उपर्युक्त के साथ) यदि यह वास्तव में आपके आयात और स्थान के बीच इतनी लंबी दूरी है, तो यह हो सकता है कि आपका मॉड्यूल बहुत बड़ा हो। किसी आयात के लिए जो कुछ भी उपयोग नहीं करता है, वह उस स्थान का संकेत हो सकता है जहां आपका कोड अधिक प्रबंधनीय आकार के हिस्से में दोबारा काम करने के लिए खड़ा हो सकता है।

+3

परिसंचरण को अपघटन के माध्यम से तय किया जा सकता है। सशर्त आयात - सबसे अच्छे हैं - एक घबराहट कामकाज। मैं कहूंगा कि यह 99.7% समय है और 0.3% "जब तक आप परिपत्र को ठीक करने के लिए विघटन नहीं कर सकते"। –

14

हर किसी ने पहले ही पीईपी का उल्लेख किया है, लेकिन पर भी पर ध्यान देना महत्वपूर्ण कोड के बीच में आयात विवरण है। कम से कम पायथन 2.6 के तहत, फ़ंक्शन के आयात विवरण होने पर कई और बाइटकोड निर्देश आवश्यक होते हैं।

>>> def f(): 
    from time import time 
    print time() 

>>> dis.dis(f) 
    2   0 LOAD_CONST    1 (-1) 
       3 LOAD_CONST    2 (('time',)) 
       6 IMPORT_NAME    0 (time) 
       9 IMPORT_FROM    0 (time) 
      12 STORE_FAST    0 (time) 
      15 POP_TOP    

    3   16 LOAD_FAST    0 (time) 
      19 CALL_FUNCTION   0 
      22 PRINT_ITEM   
      23 PRINT_NEWLINE  
      24 LOAD_CONST    0 (None) 
      27 RETURN_VALUE 

>>> def g(): 
    print time() 

>>> dis.dis(g) 
    2   0 LOAD_GLOBAL    0 (time) 
       3 CALL_FUNCTION   0 
       6 PRINT_ITEM   
       7 PRINT_NEWLINE  
       8 LOAD_CONST    0 (None) 
      11 RETURN_VALUE 
संबंधित मुद्दे