Для чего нужна переменная уровня модуля Python __all__?

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

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

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

Итак... что за питон __all__ переменная уровня модуля для?

3 ответа

Решение

У него две цели:

  1. Любой, кто читает исходный код, будет знать, что такое публичный API. Это не мешает им ковыряться в частных объявлениях, но дает хорошее предупреждение не делать этого.

  2. Когда используешь from mod import *, только имена, перечисленные в __all__ будет импортирован. На мой взгляд, это не так важно, потому что импортировать все - очень плохая идея.

http://docs.python.org/tutorial/modules.html

Что происходит, когда пользователь пишет from sound.effects import *? В идеале можно надеяться, что это каким-то образом поступит в файловую систему, найдет, какие подмодули присутствуют в пакете, и импортирует их все. Это может занять много времени, и импорт субмодулей может иметь нежелательные побочные эффекты, которые должны происходить, только если субмодуль явно импортирован.

Единственное решение для автора пакета - предоставить явный индекс пакета. Оператор импорта использует следующее соглашение: если пакет __init__.py Код определяет список с именем __all__, он считается списком имен модулей, которые следует импортировать при from package import * встречается. Автор пакета должен поддерживать этот список в актуальном состоянии при выпуске новой версии пакета. Авторы пакетов могут также принять решение не поддерживать его, если они не видят использования для импорта * из своего пакета.

Он контролирует то, что вы получаете в ваше пространство имен, когда вы

from blah import *

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

Другие вопросы по тегам