2009-12-01 9 views
5

मान लीजिए आप निम्नलिखितउपपृष्ठों का स्वयं का आयात या नहीं?

b 
b/__init__.py 
b/c 
b/c/__init__.py 
b/c/d 
b/c/d/__init__.py 

कुछ अजगर संकुल में, यदि आप import b, आप केवल प्रतीकों ख में परिभाषित प्राप्त की है। बीटी तक पहुंचने के लिए, आपको स्पष्ट रूप से import b.c या from b import c होना होगा। दूसरे शब्दों में, आपको

import b 
import b.c 
import b.c.d 
print b.c.d 

अन्य मामलों में मैंने सभी उप-पैकेजों का स्वचालित आयात देखा। इसका मतलब है कि निम्नलिखित कोड एक त्रुटि का उत्पादन नहीं करता

import b 
print b.c.d 

क्योंकि b/__init__.py अपने सबपैकेज आयात करने का ख्याल रखता है। मैं पहले (स्पष्ट से स्पष्ट स्पष्ट) पसंद करता हूं, और मैंने हमेशा इसका इस्तेमाल किया, लेकिन क्या ऐसे मामले हैं जहां दूसरे को पहले को प्राथमिकता दी जाती है?

उत्तर

5

मुझे नामस्थान पसंद हैं - इसलिए मुझे लगता है कि import b केवल b में ही होना चाहिए (संभवतः b/__init__.py में)। अगर वहाँ b.c में अन्य कार्यक्षमता को अलग करने, b.c.d, या जो कुछ भी एक कारण नहीं है, तो बस import b यह सब में खींचें चाहिए नहीं - अगर "खींचें में सभी" होता है, मुझे लगता है कि पता चलता है कि नाम स्थान जुदाई शायद एक फर्जी था एक के साथ शुरू करने के लिए। बेशक, यहां तक ​​कि मानक पुस्तकालय में उदाहरण (import os, तो आप os.path.join उपयोग कर सकते हैं और की तरह) हैं, लेकिन वे जिस तरह से प्राचीन रहे हैं, अब अनिवार्य रूप से "grandfathered" बातों से पहले अजगर पैकेजिंग प्रणाली परिपक्व और स्थिर था। नए कोड में, मैं चाहते दृढ़ता से अनुशंसा करते हैं कि एक पैकेज नहीं खींचें सवारी के लिए साथ अपने सबपैकेज जब आप इसे आयात करना चाहिए। (पाइथन प्रॉम्प्ट पर import this करें और यह दिखाए गए आखिरी पंक्ति पर विचार करें ;-)।

0

__all__ = [अपने वार्स, कार्य, कक्षाएं]

में पैकेज ख के __init__.py ऑटो लोड dict में सूचीबद्ध बातें करने के लिए उपरोक्त वाक्य रचना का प्रयोग करें। :)

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