Для чего нужна переменная уровня модуля Python __all__?
Я видел это много в исходном коде Python/Lib, но я не знаю, для чего он.
Я думал, что это было использовано для ограничения доступных членов модуля. Так что только элементы в __all__
появится когда dir(module)
,
Я сделал небольшой пример и увидел, что он не работает, как я ожидал.
Итак... что за питон __all__
переменная уровня модуля для?
3 ответа
У него две цели:
Любой, кто читает исходный код, будет знать, что такое публичный API. Это не мешает им ковыряться в частных объявлениях, но дает хорошее предупреждение не делать этого.
Когда используешь
from mod import *
, только имена, перечисленные в__all__
будет импортирован. На мой взгляд, это не так важно, потому что импортировать все - очень плохая идея.
http://docs.python.org/tutorial/modules.html
Что происходит, когда пользователь пишет
from sound.effects import *
? В идеале можно надеяться, что это каким-то образом поступит в файловую систему, найдет, какие подмодули присутствуют в пакете, и импортирует их все. Это может занять много времени, и импорт субмодулей может иметь нежелательные побочные эффекты, которые должны происходить, только если субмодуль явно импортирован.Единственное решение для автора пакета - предоставить явный индекс пакета. Оператор импорта использует следующее соглашение: если пакет
__init__.py
Код определяет список с именем__all__
, он считается списком имен модулей, которые следует импортировать приfrom package import *
встречается. Автор пакета должен поддерживать этот список в актуальном состоянии при выпуске новой версии пакета. Авторы пакетов могут также принять решение не поддерживать его, если они не видят использования для импорта * из своего пакета.
Он контролирует то, что вы получаете в ваше пространство имен, когда вы
from blah import *