Python Glossary English

все 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Сообщить о неточности