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