Шаг 184.
Python: сборник рецептов.
Модули и пакеты. Контроль импортирования

    На этом шаге мы рассмотрим решение этой задачи.

Задача

    Вам нужен полный контроль над именами, которые экспортируются из модуля или пакета, когда пользователь применяет инструкцию from module import *.

Решение

    Определите переменную __all__ в вашем модуле, где явно перечислите экспортируемые имена. Например:

# somemodule.py 
def spam():
    pass

def grok(): 
    pass

blah = 42

# Экспортирует только 'spam' и 'grok'
__all__ = ['spam', 'grok']


Обсуждение

    Хотя использование from module import * не поощряется, это все еще часто встречающийся прием при работе с модулями, в которых определено очень много имен. Если вы ничего не предпримете, эта форма будет экспортировать все имена, которые не начинаются с нижнего подчеркивания. С другой стороны, если вы определите __all__, то только явно перечисленные в ней имена будут экспортированы.

    Если вы определите __all__ как пустой список, ничего экспортироваться не будет. Если __all__ содержит неопределенные имена, то будет возбуждено исключение AttributeError.

    На следующем шаге мы рассмотрим импортирование подмодулей пакета с использованием относительных имен.




Предыдущий шаг Содержание Следующий шаг