Подтвердить что ты не робот

Что такое переменная уровня модуля python __all__?

Я видел это много в исходном коде python/Lib, но я не знаю, для чего он нужен.

Я думал, что он используется для ограничения доступных членов модуля. Таким образом, только когда элементы __all__ будут отображаться, когда dir(module).

Я сделал небольшой пример и увидел, что он не работает так, как я ожидал.

Итак... Какая переменная уровня модуля python __all__ для?

4b9b3361

Ответ 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 *

См. Импорт * из пакета