Моя посылка имеет следующую структуру:
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__
иimport *
является избыточным,__all__
требуется толькоЯ думаю, что одной из наиболее веских причин для использования
import *
в__init__.py
импорте пакетов является возможность рефакторинга сценария, который вырос в несколько сценариев, не нарушая существующее приложение. Но если вы разрабатываете пакет с самого начала. Я думаю, что лучше оставить__init__.py
файлы пустыми.например:
то приложение растет и теперь это целая папка
тогда скрипт инициализации может сказать
чтобы сценарий, написанный для выполнения следующих действий, не прерывался во время изменения:
источник
__all__
иimport *
является избыточным",__all__
используется потребителем модуля иfrom foo import *
используется самим модулем для использования других ....using __all__ and import * is redundant, only __all__ is needed
Как эти излишни? Они делают разные вещи.Мои собственные
__init__.py
файлы чаще всего пусты. В частности, у меня никогда не былоfrom blah import *
части__init__.py
- если «импорт пакета» означает получение всех видов классов, функций и т. Д., Определенных непосредственно как часть пакета, то я бы вместо этого скопировал содержимоеblah.py
в пакет__init__.py
и удалилblah.py
( умножение исходных файлов здесь не годится).Если вы настаиваете на поддержке
import *
идиом (eek), то использование__all__
(с минимальным списком имен, который вы можете себе представить) может помочь в контроле за ущербом. В общем, пространства имен и явный импорт - это хорошо , и я настоятельно рекомендую пересмотреть любой подход, основанный на систематическом обходе одного или обоих понятий! -)источник
import *
вы должны безоговорочно принять все фреймворки, даже те функции, которые вы никогда не будете использовать. сохраняя__init__.py
пустой даст вам больше шансов , чем просто все или ничего семантического. думать о витойfrom mobilescouter import A, B
это всего лишь строка кода, и у вас нет проекта с 666 классами и у каждого свой файл, верно? еслиimport *
в вашем коде их два или более, вы заполняете пространство имен потенциальным мусором и быстро забудете, откуда ониA
берутся. А если верхний пакет сделать тоже самое? вы захватываете все подпакеты и подпакеты. как говорит дзен питона, явное лучше, чем неявное.У тебя
__init__.py
должна быть документальная строка .Хотя вся функциональность реализована в модулях и подпакетах, строка документации вашего пакета - это то место, где нужно документировать, с чего начать. Например, рассмотрим пакет python
email
. Документация пакета представляет собой введение, описывающее цель, фон и то, как различные компоненты в пакете работают вместе. Если вы автоматически генерируете документацию из строк документации, используя sphinx или другой пакет, пакет документации doc является именно тем местом, где можно описать такое введение.Для любого другого контента, посмотрите отличные ответы от Firecrow и Alex Martelli .
источник
__init__.py
дляemail
пакета это руководство? Я вижу одну строку документации, которая мало что объясняет, «как различные компоненты в пакете работают вместе».