все Python 3Модули и импортпонятие
__all__
импорт
Список строк в модуле или пакете: какие имена забирает from m import * и что считается публичным API для документации и линтеров.
Синтаксис
__all__ = ['public_func', 'PublicClass']
__all__ не делает имена приватными: import m; m._x и явный from m import helper работают, даже если helper в списке нет, — он влияет только на звёздочку, help() и инструменты. Без __all__ звёздочка берёт все имена без подчёркивания в начале, включая модули, импортированные внутри (os, sys), — так они «утекают» к вызывающему. Имя в __all__, которого нет в модуле, обнаружится только при from m import *: падает AttributeError. В __init__.py пакета __all__ перечисляет и подмодули — их звёздочка импортирует; без __all__ from pkg import * подмодули не загружает вовсе.
Примеры
import sys
sys.path.insert(0, '.')
with open('mylib.py', 'w', encoding='utf-8') as f:
f.write("__all__ = ['public']\ndef public(): return 'pub'\n"
"def helper(): return 'help'\ndef _secret(): return 'sec'\n")
from mylib import *
print([n for n in ('public', 'helper', '_secret') if n in globals()]) # → ['public']
from mylib import helper, _secret # явный импорт __all__ не ограничивает
print(helper(), _secret()) # → help sec
import os, sys
sys.path.insert(0, '.')
os.makedirs('kit', exist_ok=True)
with open('kit/__init__.py', 'w', encoding='utf-8') as f:
f.write("__all__ = ['a']\n")
for name in ('a', 'b'):
with open(f'kit/{name}.py', 'w', encoding='utf-8') as f:
f.write('x = 1\n')
from kit import *
print('a' in globals(), 'b' in globals()) # → True False
import sys
sys.path.insert(0, '.')
with open('broken.py', 'w', encoding='utf-8') as f:
f.write("__all__ = ['missing']\n")
import broken # сам импорт проходит
from broken import * # → AttributeError: module 'broken' has no attribute 'missing'
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности