2012-05-20 17 views
8

क्या इससे कोई फर्क पड़ता है कि कोड में मॉड्यूल लोड किए जाते हैं? या उन सभी को शीर्ष पर घोषित किया जाना चाहिए, क्योंकि लोड समय के दौरान बाहरी मॉड्यूल को लोड किया जाना चाहिए चाहे वे कोड में कहां घोषित किए गए हों ...?पायथन: अनुकूलन आयात

उदाहरण:

from os import popen 

try: 
    popen('echo hi') 
    doSomethingIllegal; 
except: 
    import logging     #Module called only when needed? 
    logging.exception("Record to logger) 

या इस संकलक द्वारा के रूप में एक ही तरह से अनुकूलित है:

from os import popen 
import logging      #Module will always loaded regardless 

try: 
    popen('echo hi') 
    doSomethingIllegal; 
except: 
    logging.exception("Record to logger) 

उत्तर

10

This इंगित करता है यह एक फर्क हो सकता है:

"आयात बयान क्रियान्वित किया जा सकता बस कहीं भी। अक्सर उनकी दृश्यता को सीमित करने और/या आरंभिक स्टार्टअप समय को कम करने के लिए उन्हें कार्यों के अंदर रखने के लिए उपयोगी होता है। हालांकि पायथन के दुभाषिया एक ही मॉड्यूल कई बार आयात नहीं करने के लिए अनुकूलित है, बार-बार क्रियान्वित एक आयात बयान को गंभीरता से कुछ परिस्थितियों में प्रदर्शन को प्रभावित कर सकता है। "

इन दो ओएस सवाल, local import statements? और import always at top of module? विस्तार से इस पर चर्चा।

अंत में, यदि आप अपने विशिष्ट मामले के बारे में उत्सुक हैं आप अपने वातावरण में/बेंचमार्क प्रोफ़ाइल सकता है अपने दो विकल्प।

मैं निम्नलिखित stylis स्रोत फ़ाइल के शीर्ष पर मेरी आयात बयानों के सभी डाल करने के लिए पसंद करते हैं टिक सम्मेलन और स्थिरता के लिए (यह बाद में आसानी से बिखरे हुए आयात विवरणों की तलाश में स्रोत फ़ाइल के माध्यम से शिकार करने के लिए आसान हो जाएगा)

+0

अभी भी थोड़ा उलझन में है। किसी भी अपवाद को बुलाए जाने पर लोडर को बाहरी मॉड्यूल को वैसे भी लोड करना होगा? एकमात्र ओवरहेड मैं देख सकता हूं अपवाद में कोड की एक अतिरिक्त पंक्ति है। – tetris11

+1

बस अपने कोड में स्पष्ट रहें, फ़ाइल के शीर्ष पर अपने आयात करें। –

+0

@JakobBowyer लेकिन क्या अंतर है, प्रदर्शन के अनुसार मैं वास्तव में – tetris11

2

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

अजगर शैली गाइड कैसे आयात दिखना चाहिए के लिए कुछ बुनियादी दिशा निर्देशों को शामिल किया गया: http://www.python.org/dev/peps/pep-0008/#imports

व्यवहार में, हालांकि, कई बार जब यह एक विशेष समारोह के भीतर से आयात करने के लिए समझ में आता है कर रहे हैं। यह आयात कि परिपत्र होगा के साथ आता है:

# Module 1 
from module2 import B 

class A(object): 
    def do_something(self): 
     my_b = B() 
     ... 

# Module 2 
from module1 import A 

class B(object): 
    def do_something(self): 
     my_a = A() 
     ... 

कि उसी रूप में काम नहीं करेगा, लेकिन आप घेरा चारों ओर आयात को ले जाकर मिल सकता है: आदर्श रूप में

# Module 1 
from module2 import B 

class A(object): 
    def do_something(self): 
     my_b = B() 
     ... 

# Module 2 
class B(object): 
    def do_something(self): 
     from module1 import A 
     my_a = A() 
     ... 

, आप डिजाइन होगा कक्षाएं जैसे कि यह कभी नहीं आएगी, और शायद उन्हें एक ही मॉड्यूल में भी शामिल कर सकते हैं। उस खिलौने के उदाहरण में, प्रत्येक आयात को दूसरे को वास्तव में समझ में नहीं आता है। हालांकि, व्यावहारिक रूप से, कुछ ऐसे मामले हैं जहां विधि के भीतर एक विधि के लिए आयात को शामिल करने के बजाय, एक ही मॉड्यूल में सबकुछ फेंकने या किसी अन्य ऑब्जेक्ट को प्रश्न में निकालने के बजाय इसे अधिक समझ में आता है।

लेकिन, जब तक आपके पास विचलन करने का कोई अच्छा कारण न हो, मैं कहता हूं कि मॉड्यूल के शीर्ष-सम्मेलन के साथ जाना है।

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