2011-03-10 12 views
33

मैंने util नामक एक मॉड्यूल बनाया जो कक्षाओं और कार्यों को प्रदान करता है जो मैं अक्सर पायथन में उपयोग करता हूं। उनमें से कुछ आयातित सुविधाओं की आवश्यकता है। कक्षा/कार्य परिभाषा के अंदर आवश्यक चीजों को आयात करने के पेशेवर और विपक्ष क्या हैं? मॉड्यूल फ़ाइल की शुरुआत में import से बेहतर है? क्या यह एक अच्छा विचार है?कक्षा/कार्य परिभाषा के अंदर आयात विवरण - क्या यह एक अच्छा विचार है?

+1

संभव डुप्लिकेट (http://stackoverflow.com/questions/1188640/good-or-bad-practice-in- python-import-in-the-middle-of-a-file) –

उत्तर

37

यह सबसे आम शैली है फ़ाइल के शीर्ष पर हर आयात डाल करने के लिए। पीईपी 8 इसकी सिफारिश करता है, जो इसे शुरू करने के लिए एक अच्छा कारण है। लेकिन यह एक सनकी नहीं है, इसके फायदे हैं (हालांकि बाकी सब कुछ अपराध करने के लिए पर्याप्त महत्वपूर्ण नहीं है)। यह पूरी फाइल को देखने के विरोध में, सभी आयातों को एक नज़र में ढूंढने की अनुमति देता है। यह भी सुनिश्चित करता है कि किसी भी अन्य कोड (जो कुछ आयात पर निर्भर हो सकता है) से पहले सबकुछ आयात किया जाता है। NameError एस आमतौर पर हल करने में आसान हैं, लेकिन वे परेशान हो सकते हैं।

मॉड्यूल को एक छोटे से दायरे में रखते हुए कोई भी महत्वपूर्ण (महत्वपूर्ण) नामस्थान प्रदूषण से बचा जाना चाहिए, क्योंकि आप जो भी जोड़ते हैं वह वास्तविक मॉड्यूल (no, import * doesn't count and probably shouldn't be used anyway) है। कार्यों के अंदर, आप प्रत्येक कॉल पर फिर से आयात करेंगे (वास्तव में हानिकारक नहीं है क्योंकि सब कुछ एक बार आयात किया जाता है, लेकिन इसके लिए अनिश्चित)।

+0

मैंने अपनी पसंद को इस उत्तर में बदल दिया। मैंने इसका विश्लेषण किया और अब तक यह सबसे अच्छा है। –

+0

मुझे लगता है कि इसके लिए सबसे अच्छा तर्क यह है: यदि आप फ़ाइल आयात करते हैं, तो आप आयात पर जांच करना चाहते हैं यदि आपके पास सभी सही पैकेज हैं, तो बिंदु पर नहीं, आप एक निश्चित फ़ंक्शन का उपयोग करेंगे। बेशक यह हो सकता है कि आपको सभी पैकेजों की आवश्यकता नहीं है (मुझे लगता है कि यह नकारात्मक है) –

2

मेरा मानना ​​है कि यह सर्वोत्तम अभ्यास है (कुछ पीईपी के अनुसार) कि आप मॉड्यूल की शुरुआत में आयात विवरण रखते हैं। आप __init__.py फ़ाइल में आयात विवरण जोड़ सकते हैं, जो पैकेज के अंदर सभी मॉड्यूल में उन मॉड्यूल को आयात करेगा।

तो ... यह निश्चित रूप से कुछ है जो आप कर रहे हैं जिस तरह से आप कर रहे हैं, लेकिन यह निराश और वास्तव में अनावश्यक है।

12

PEP8, अजगर स्टाइल गाइड, कहा गया है कि:

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

बेशक यह कोई कठिन और तेज़ नियम नहीं है, और आयात कहीं भी जा सकते हैं जहां आप चाहते हैं। लेकिन उन्हें शीर्ष पर रखना इसके बारे में जाने का सबसे अच्छा तरीका है। आप निश्चित रूप से कार्यों या कक्षा के भीतर आयात कर सकते हैं।

लेकिन ध्यान दें यदि आप ऐसा नहीं कर सकते हैं:

def foo(): 
    from os import * 

क्योंकि:

SyntaxWarning: import * only allowed at module level 
+0

जब मैं मॉड्यूल की शुरुआत में आयात विवरण डालता हूं, और फिर इस मॉड्यूल को एक अलग फ़ाइल में उपयोग करता हूं और इसमें 'dir (util)' कहता हूं, I मैंने 'util.py' के अंदर परिभाषित कार्यों/वर्गों के नाम न केवल 'आयात' किए हैं जो वहां बनाए गए हैं। अच्छी है? –

+0

हां, क्योंकि 'आयात' लोड स्रोत फ़ाइल में सभी कथन निष्पादित करता है। तो मान लीजिए कि एक मॉड्यूल 'एक्स' है जो' वाई 'आयात करता है। अब जब हम किसी अन्य मॉड्यूल में 'एक्स' आयात करते हैं, तो' वाई 'भी आयात किया जाता है। – user225312

+0

मैंने सोचा कि यह encapsulation का उल्लंघन करता है क्योंकि किसी के पास कार्यान्वयन के लिए कुछ पहुंच है (मैंने उपयोग किए गए मॉड्यूल के बारे में जानकारी प्राप्त की है)। –

2

जबकि अन्य उत्तर अधिकतर सही हैं, तो एक कारण है कि पाइथन इसे अनुमति देता है।

अनावश्यक सामान आयात करने के लिए यह स्मार्ट नहीं है, जिसकी आवश्यकता नहीं है। तो, यदि आप उदा। XML तत्व को एक तत्व पेड़ में पार्स करें, लेकिन यदि lxml उपलब्ध है तो धीमे बिल्टिन एक्सएमएल पार्सर का उपयोग नहीं करना चाहते हैं, तो आपको उस पलर को आमंत्रित करने के लिए आपको उस पल की जांच करनी होगी।

और बजाय शुरुआत में lxml की उपलब्धता को याद रखने की है, मैं, try आयात और lxml का उपयोग कर पसंद करेंगे except यह वहाँ नहीं है, ऐसी स्थिति में मैं builtin xml मॉड्यूल पर वापस आने लगेगा।

1

उड़ान भेड़ के जवाब की तरह, मैं मानता हूं कि अन्य सही हैं, लेकिन जब मैं कोड विकसित कर रहा हूं तो __init__() दिनचर्या और फ़ंक्शन कॉल जैसे अन्य स्थानों में आयात करता हूं। मेरे वर्ग या फ़ंक्शन का परीक्षण किया गया है और इसके अंदर आयात के साथ काम करने के लिए सिद्ध किया गया है, मैं आमतौर पर पीईपी 8 दिशानिर्देशों के बाद आयात के साथ अपना स्वयं का मॉड्यूल देता हूं। मैं ऐसा इसलिए करता हूं क्योंकि कभी-कभी मैं कोड को दोबारा करने या बुरे विचारों के साथ पुराने कोड को हटाने के बाद आयात को हटाना भूल जाता हूं। विकास के तहत वर्ग या कार्य के अंदर आयात को रखकर, मैं इसकी निर्भरताओं को निर्दिष्ट कर रहा हूं कि मैं इसे कहीं और कॉपी करना चाहता हूं या इसे अपने मॉड्यूल में प्रचारित करना चाहता हूं ...

0

केवल स्थानीय दायरे में आयात को स्थानांतरित करें, जैसे कि अंदर कार्य परिभाषा, यदि किसी परिपत्र आयात से बचने या मॉड्यूल के प्रारंभिक समय को कम करने की कोशिश कर रहे किसी समस्या को हल करना आवश्यक है। यह तकनीक विशेष रूप से सहायक होती है यदि प्रोग्राम निष्पादित करने के तरीके के आधार पर कई आयात अनावश्यक हैं। यदि आप उस फ़ंक्शन में मॉड्यूल का उपयोग कभी भी करते हैं तो आप आयात को फ़ंक्शन में ले जाना भी चाह सकते हैं। ध्यान दें कि मॉड्यूल को एक बार प्रारंभ करने के कारण पहली बार मॉड्यूल लोड करना महंगा हो सकता है, लेकिन मॉड्यूल को कई बार लोड करना लगभग मुफ्त है, केवल कुछ शब्दकोश लुकअप की लागत है। यहां तक ​​कि यदि मॉड्यूल का नाम गुंजाइश से बाहर हो गया है, तो मॉड्यूल शायद sys.modules में उपलब्ध है।

https://docs.python.org/3/faq/programming.html#what-are-the-best-practices-for-using-import-in-a-module

[अच्छा या बुरा व्यवहार अजगर में: एक फ़ाइल के बीच में आयात] की
संबंधित मुद्दे