2009-12-22 11 views
148

मेरे पैकेज निम्नलिखित संरचना है:मैं कैसे अच्छा/सही पैकेज __init__.py फ़ाइलें लिखने करना

mobilescouter/ 
    __init__.py #1 
    mapper/ 
     __init__.py #2 
     lxml/ 
      __init__.py #3 
      vehiclemapper.py 
      vehiclefeaturemapper.py 
      vehiclefeaturesetmapper.py 
     ... 
     basemapper.py 
    vehicle/ 
     __init__.py #4 
     vehicle.py 
     vehiclefeature.py 
     vehiclefeaturemapper.py 
    ... 

मुझे यकीन है कि कैसे __init__.py फ़ाइलों को सही ढंग लिखा जाना चाहिए नहीं कर रहा हूँ।

__all__ = ['mapper', 'vehicle'] 
import mapper 
import vehicle 

लेकिन यह कैसे उदाहरण के लिए की तरह __init__.py #2 दिखना चाहिए:
__init__.py #1 तरह लग रहा है? मेरा है:

__all__ = ['basemapper', 'lxml'] 
from basemaper import * 
import lxml 

__all__ कब उपयोग किया जाना चाहिए?

+0

ध्यान रखें कि कोड में आयात * का उपयोग करना आम तौर पर बहुत बुरा अभ्यास है और यदि संभव हो तो इससे बचा जाना चाहिए। इसके लिए बहुत कम उपयोग के मामले हैं, लेकिन वे वास्तव में दुर्लभ हैं। – Mayou36

उत्तर

116

__all__ बहुत अच्छा है - यह मॉड्यूल स्वचालित रूप से आयात करने बिना गाइड आयात बयान में मदद करता है http://docs.python.org/tutorial/modules.html#importing-from-a-package

का उपयोग कर __all__ और import * बेमानी है, केवल __all__

मैं सबसे शक्तिशाली कारणों एकमें import * उपयोग करने के लिए में से एक लगता है की जरूरत है संकुल आयात करने के लिएएक स्क्रिप्ट को दोबारा करने में सक्षम होना है जो मौजूदा अनुप्रयोग को तोड़ने के बिना कई स्क्रिप्ट में उगाया गया है। लेकिन अगर आप शुरुआत से पैकेज तैयार कर रहे हैं। मुझे लगता है कि __init__.py फ़ाइलों को खाली छोड़ना सबसे अच्छा है।

उदाहरण के लिए

:

foo.py - contains classes related to foo such as fooFactory, tallFoo, shortFoo 

तो एप्लिकेशन बढ़ता है और अब यह एक पूरी फ़ोल्डर

foo/ 
    __init__.py 
    foofactories.py 
    tallFoos.py 
    shortfoos.py 
    mediumfoos.py 
    santaslittlehelperfoo.py 
    superawsomefoo.py 
    anotherfoo.py 

तो init स्क्रिप्ट कह सकते हैं

__all__ = ['foofactories', 'tallFoos', 'shortfoos', 'medumfoos', 
      'santaslittlehelperfoo', 'superawsomefoo', 'anotherfoo'] 
# deprecated to keep older scripts who import this from breaking 
from foo.foofactories import fooFactory 
from foo.tallfoos import tallFoo 
from foo.shortfoos import shortFoo 

ताकि एक स्क्रिप्ट के लिए लिखा है निम्नलिखित परिवर्तन के दौरान तोड़ना नहीं है:

from foo import fooFactory, tallFoo, shortFoo 
+2

मैं बहुत लाइन आयात द्वारा '__all__' और लाइन के बारे में उलझन में था। आपका उदाहरण बहुत रोशन कर रहा है। – Junchen

98

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

यदि आप import * idioms (eek) का समर्थन करने पर जोर देते हैं, तो __all__ का उपयोग करके (नामों की एक सूची के रूप में जैसे आप स्वयं को इसमें शामिल कर सकते हैं) क्षति नियंत्रण के लिए सहायता कर सकते हैं। सामान्य तौर पर, नामस्थान और स्पष्ट आयात अच्छा बातें हैं, और मैं मजबूत व्यवस्थित के आधार पर किसी एक या दोनों अवधारणाओं को दरकिनार किसी भी दृष्टिकोण पर पुनर्विचार का सुझाव -!)

+9

व्यक्तिगत रूप से, मैं चीजों को अलग रखना पसंद करता हूं, और फिर * आयात करता हूं। यही कारण यह है कि, तह और सामान के बावजूद, मुझे अभी भी संबंधित कई श्रेणियों वाली फाइलों को ब्राउज़ करने से नफरत है। –

+4

@stefano एक बड़े ढांचे के बारे में सोचते हैं।यदि यह 'आयात *' का उपयोग करता है तो आपको बिना किसी शर्त में सभी ढांचे को स्वीकार करना होगा, यहां तक ​​कि उन सुविधाओं को भी जिन्हें आप कभी भी उपयोग नहीं करेंगे। '__init __। py' खाली रखने से आपको केवल सभी या कुछ भी अर्थपूर्ण से अधिक संभावनाएं मिलती हैं। मोड़ के बारे में सोचो। –

+0

अगर इसे खाली रखें, आयात मोबाइल के बाद भी, कोई भी mobilescouter.mapper या mobilescouter.vehicle या mobilescouter का उपयोग नहीं कर सकता है। जो भी हो। mobilescouter आयात नहीं है। ए, mobilescouter.B ..... भी verbose? – sunqiang

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