2009-11-09 17 views
19

कोड आयात करने के विभिन्न तरीकों में से, क्या कुछ तरीके हैं जो दूसरों की तुलना में उपयोग करने के लिए बेहतर हैं? लघु में इस कड़ी http://effbot.org/zone/import-confusion.htm कहा गया है किपायथन (और Django) सर्वोत्तम आयात प्रथाओं

from foo.bar import MyClass 

सामान्य परिस्थितियों में या जब तक आप जानते हैं कि आप क्या कर रहे हैं MyClass आयात करने के लिए पसंदीदा तरीका नहीं है। (बल्कि, एक बेहतर तरीका चाहते हैं:

import foo.bar as foobaralias 

और उसके बाद कोड में, उपयोग करने के लिए MyClass का उपयोग

foobaralias.MyClass 

)

संक्षेप में, ऐसा लगता है कि इसके बाद के संस्करण संदर्भित कड़ी है यह कह रहा है कि यह आमतौर पर मॉड्यूल के कुछ हिस्सों की बजाय मॉड्यूल से सब कुछ आयात करने के लिए बेहतर है।

हालांकि, मैंने जो लेख लिखा है वह वास्तव में पुराना है।

मैंने यह भी सुना है कि कम से कम Django परियोजनाओं के संदर्भ में, यह केवल उन मॉड्यूल को आयात करने के लिए बेहतर है, जिन्हें आप पूरे मॉड्यूल के बजाय उपयोग करना चाहते हैं। यह कहा गया है कि यह फ़ॉर्म सर्कुलर आयात त्रुटियों से बचने में मदद करता है या कम से कम django आयात प्रणाली को कम नाजुक बनाता है। यह इंगित किया गया था कि Django का अपना कोड "आयात x" पर "x आयात y से" पसंद करता है।

इस परियोजना को मानते हुए कि मैं काम कर रहा हूं __init__.py की किसी विशेष विशेषताओं का उपयोग नहीं करता ... (हमारी सभी __init__.py फ़ाइलें खाली हैं), मुझे किस आयात विधि का पक्ष लेना चाहिए, और क्यों?

उत्तर

5

मेरे लिए, यह स्थिति पर निर्भर है। यदि यह एक विशिष्ट नामित विधि/वर्ग है (यानी process() या ऐसा कुछ नहीं), और आप इसे लॉट का उपयोग करने जा रहे हैं, तो टाइपिंग सहेजें और केवल from foo import MyClass करें।

यदि आप एक मॉड्यूल से कई चीजें आयात कर रहे हैं, तो संभवतः मॉड्यूल आयात करना बेहतर है, और नामस्थान को साफ रखने के लिए module.bar, module.foo, module.baz इत्यादि करना बेहतर है।

आप यह भी कहा

यह कहा गया है इस फार्म परिपत्र आयात त्रुटियों से बचने में मदद करता है या कम से कम Django आयात प्रणाली कम नाजुक बना देता है। यह इंगित किया गया था कि Django का अपना कोड "आयात x" पर "x आयात y से" पसंद करता है।

मुझे नहीं पता कि कैसे एक रास्ता या दूसरा सर्कुलर आयात को रोकने में मदद करेगा। इसका कारण यह है कि जब भी आप from x import y करते हैं, तब भी x आयात किया जाता है। केवल y को वर्तमान नामस्थान में लाया गया है, लेकिन संपूर्ण मॉड्यूल x संसाधित किया गया है। इस उदाहरण आज़माएं:

def a(): 
    print "a" 

print "hi" 

def b(): 
    print "b" 

print "bye" 

फिर 'runme.py' में, डाल:

test.py में, निम्न डाल

from test import b 

b() 

तो बस करना python runme.py

आपको निम्न आउटपुट दिखाई देगा:

hi 
bye 
b 

तो test.py में सब कुछ चलाया गया था, भले ही आपने केवल b

2

उत्तरार्द्ध का लाभ यह है कि MyClass की उत्पत्ति अधिक स्पष्ट है। पूर्व MyClass को वर्तमान नेमस्पेस में रखता है ताकि कोड केवल MyClass को अयोग्य घोषित कर सके। तो कोड को पढ़ने वाले किसी व्यक्ति के लिए यह कम स्पष्ट है जहां MyClass परिभाषित किया गया है।

13

पहला, और प्राथमिक, आयात का नियम: कभी भी from foo import * का उपयोग न करें।

लेख चक्रीय आयात के मुद्दे पर चर्चा कर रहा है, जो आज भी खराब-संरचित कोड में मौजूद है। मैं चक्रीय आयात नापसंद करता हूं; उनकी उपस्थिति एक मजबूत संकेत है कि कुछ मॉड्यूल बहुत अधिक कर रहा है, और इसे विभाजित करने की जरूरत है। यदि किसी भी कारण से आपको चक्रीय आयात के साथ कोड के साथ काम करने की आवश्यकता है जिसे पुन: व्यवस्थित नहीं किया जा सकता है, import foo एकमात्र विकल्प है।

ज्यादातर मामलों में, import foo और from foo import MyClass के बीच बहुत अंतर नहीं है। मैं दूसरे को पसंद करते हैं, कम लिखना शामिल है क्योंकि, लेकिन वहाँ कुछ कारणों से मैं पहली बार का उपयोग दे सकता है:

  • मॉड्यूल और वर्ग/मूल्य अलग-अलग नाम है। पाठकों के लिए यह याद रखना मुश्किल हो सकता है कि आयातित मूल्य का नाम मॉड्यूल से असंबंधित होने पर, जहां से कोई विशेष आयात आ रहा है।

    • अच्छा: import myapp.utils as utils; utils.frobnicate()
    • अच्छा: import myapp.utils as U; U.frobnicate()
    • बुरा: from myapp.utils import frobnicate
  • आप एक मॉड्यूल से मूल्यों का एक बहुत आयात कर रहे हैं। अपनी उंगलियों, और पाठक की आंखों को बचाओ।

    • बुरा: from myapp.utils import frobnicate, foo, bar, baz, MyClass, SomeOtherClass, # yada yada
+0

यह एक विशिष्ट अपवाद Django में हो सकता है जहां आप एक वर्ग आयात कर रहे हैं जो एक मॉडल लागू करता है (जो डेटाबेस तालिका का प्रतिनिधित्व करता है)। उस स्थिति में "django.contrib.auth आयात उपयोगकर्ता से" कहना पसंद है। लेकिन जैसा कि मैंने कहा, यह एक विशेष वातावरण के लिए विशिष्ट एक सम्मेलन है। –

+2

'myapp आयात utils से' के बारे में क्या; utils.frobnicate() '? – Joschua

+1

जोशुआ: यह भी ठीक है, क्योंकि कोई भी पढ़ रहा है, यह देखने में सक्षम होगा कि 'फ्रोब्निकेट' कहां से आयात किया जा रहा है। –

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