2012-10-12 20 views
15

में आयात करें मैंने urllib (python3) के लिए थोड़ा रैपर लिखा था। क्या यह उचित और सुरक्षितआयात करने के लिए में है?पायथन -

if self.response_encoding == 'gzip': 
    import gzip 

मुझे इस कोड के बारे में कोई पीईपी नहीं मिला। हालांकि, यह मुझे परेशान करता है।

+1

बस यह सुनिश्चित करें कि इस पैकेज से आने वाले किसी भी फ़ंक्शन को कॉल न करें अगर यह आयात नहीं किया गया है – njzk2

+0

हां यह है। यह आपको परेशान क्यों करता है? –

+0

मैं पूछना और सुनिश्चित करना चाहता था। शायद मुझे 'चिंतित' शब्द का उपयोग करना चाहिए। अंग्रेजी मेरी मूल भाषा नहीं है। –

उत्तर

19

Pyt hon मानक पुस्तकालय इसका उपयोग करता है, इसलिए यह सबसे निश्चित रूप से उचित और सुरक्षित है। एक उत्कृष्ट उदाहरण के लिए os module source देखें:

if 'posix' in _names: 
    name = 'posix' 
    linesep = '\n' 
    from posix import * 
    try: 
     from posix import _exit 
    except ImportError: 
     pass 
    import posixpath as path 
    import posix 
    __all__.extend(_get_exports_list(posix)) 
    del posix 

यह काफी अजगर में सशर्त आयात मॉड्यूल आम है। if के बजाय, आप अक्सर बहुत एक try:/except ImportError: संयोजन देखेंगे:

try: 
    from subprocess import check_output 
except ImportError: 
    # Python 2.6 and before 
    def check_output(*popenargs, **kwargs): 
     from subprocess import Popen 
     if 'stdout' in kwargs: 
      raise ValueError('stdout argument not allowed, it will be ' 
          'overridden.') 
     process = Popen(stdout=PIPE, *popenargs, **kwargs) 
     output, unused_err = process.communicate() 
     retcode = process.poll() 
     if retcode: 
      cmd = kwargs.get("args") 
      if cmd is None: 
       cmd = popenargs[0] 
      raise CalledProcessError(retcode, cmd) 
     return output 

यहाँ, हम मूल रूप से एक if परीक्षण के नैतिक बराबर का उपयोग करें: आप check_output आयात कर सकते हैं, तो ऐसा है, अन्यथा पूर्ण समारोह परिभाषित करते हैं यहाँ।

एक आयात विवरण स्थानीय नाम पर कोड के बाहरी टुकड़े का पुनः बाध्यकारी है। आयात को नियंत्रित करने के लिए if नियंत्रण प्रवाह का उपयोग उस संबंध में if कथन में एक चर निर्दिष्ट करने से अलग नहीं है। आपको यह सुनिश्चित करने की ज़रूरत है कि आप किसी भी तरीके से परिभाषित किए बिना नाम का उपयोग न करें।

+0

+1 - 'आयात करने के अलावा/आयात करें' इस प्रश्न का उत्तर देने के लिए मेरी पहली प्रवृत्ति थी। – mgilson

3

निश्चित रूप से, यह ठीक है। यह उन मामलों में भी आवश्यक हो सकता है जहां मॉड्यूल में प्रारंभिक कोड है जिसे आप हमेशा चलाने के लिए नहीं चाहते हैं।

8

यह वास्तव में एक सामान्य आम मुहावरे है। आप कभी कभी यह अलग मॉड्यूल के बीच लेने के लिए दिखाई देगा:,

if system == 'linux': 
    import linuxdeps as deps 
elif system == 'win32': 
    import win32deps as deps 
फिर

संभालने दोनों linuxdeps और win32deps ही कार्य है, तो आप बस इसे उपयोग कर सकते हैं:

deps.func() 

यह और भी प्राप्त करने के लिए प्रयोग किया जाता है मानक पुस्तकालय में os.path (os के लिए स्रोत कोड से कुछ इस प्रकार):

if 'posix' in _names: 
    name = 'posix' 
    linesep = '\n' 
    from posix import * 
    try: 
     from posix import _exit 
    except ImportError: 
     pass 
    import posixpath as path 

    import posix 
    __all__.extend(_get_exports_list(posix)) 
    del posix 

elif 'nt' in _names: 
    name = 'nt' 
    linesep = '\r\n' 
    from nt import * 
    try: 
     from nt import _exit 
    except ImportError: 
     pass 
    import ntpath as path 

    import nt 
    __all__.extend(_get_exports_list(nt)) 
    del nt 
1

क्या यह सुरक्षित है? हाँ। Martijin's answer ने बताया कि आधिकारिक पायथन इसका उपयोग करते हैं।

क्या यह उचित है? निर्भर करता है। Python performance docs बताता है कि यद्यपि पाइथन एक ही मॉड्यूल को आयात करने से बच सकता है, फिर भी ओवरहेड है।

तो मेरा मानना ​​है कि आपको खुद से पूछना चाहिए, कितनी बार अगर कथन सत्य है। यदि अक्सर, तो बड़े ओवरहेड होंगे, और आपको फ़ाइल की शुरुआत में इसे आयात करना चाहिए। यदि अक्सर नहीं, तो अगर कथन में एक बुद्धिमान विकल्प है तो आयात करें।