Мой пакет имеет следующую структуру:
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
файлы должны быть правильно записаны.
__init__.py #1
похож:
__all__ = ['mapper', 'vehicle']
import mapper
import vehicle
Но как должен, например, __init__.py #2
быть похожими? Мой:
__all__ = ['basemapper', 'lxml']
from basemaper import *
import lxml
Когда должен быть __all__
б/У?
__all__
очень хорошо - помогает направлять операции импорта без автоматического импорта модулей.
http://docs.python.org/tutorial/modules.html#importing-from-a-package
используя __all__
и импорт *
является избыточным, нужен только __all__
я думаю, что одна из самых весомых причин использовать импорт *
в __init__.py
для импорта пакетов - это возможность рефакторинга скрипта, который вырос в несколько скриптов, не нарушая при этом существующее приложение. Но если вы проектируете пакет с самого начала. Я думаю, что лучше оставить __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
Мои собственные __init__.py
файлы чаще пустые, чем нет. В частности, у меня никогда не было из blah import *
как части __init__.py
-- если "импорт пакета" означает получение всех видов классов, функций и т.д., определенных непосредственно как часть пакета, то я бы лексически скопировал содержимое blah.py
в __init__ пакета. py
вместо этого и удалить blah.py
(умножение исходных файлов здесь бесполезно).
Если вы настаиваете на поддержке импорта *
идиом (eek), то использование __all__
(с таким миниатюрным списком имён, как вы можете себе представить) может помочь в борьбе с повреждениями. В общем, пространства имен и явный импорт являются хорошими вещами, и я настоятельно рекомендую пересмотреть любой подход, основанный на систематическом обходе одного или обоих понятий!-)