export и прячет из модуля всё, что им не помеченоПитер Бирма опубликовал черновик 25 июля, целевая версия — Python 3.16. Идея в том, чтобы у модуля появился явный публичный интерфейс, а не соглашение об именах с подчёркиванием и переменная
__all__, о которой знает только импорт со звёздочкой.🔘 объявление помечается прямо в определении:
export class Public видно снаружи, а обычный class Private из dir(module) исчезает;🔘 при обращении к скрытому имени поднимается
ExportError, наследник AttributeError;🔘 переменная
__export__ со списком строк работает как список экспорта, а имена в ней могут быть ещё не определены, но тогда импорт со звёздочкой упадёт;🔘 запись
from module export NAME равносильна импорту имени с последующим его экспортом;🔘
export перед def и class разрешён только на уровне модуля, внутри функции это синтаксическая ошибка;🔘 слово мягкое, то есть существующий код с переменной по имени
export продолжит работать, а модули без __export__ ведут себя как раньше.Автор сам подчёркивает, что это не модификатор доступа: ограничение обходится удалением
__export__, правкой списка или обращением к __dict__ модуля. Смысл не в защите, а в том, чтобы автодополнение, документация и статический анализ видели границу библиотеки так же, как её видит автор.В обсуждении сразу поднялся вопрос производительности: эталонная реализация пока не оптимизирована и, вероятно, добавляет накладные расходы на обращение к атрибутам модуля. Открытым остаётся и то, как пакет должен добираться до приватных имён собственных подмодулей. Пока это черновик, и до 3.16 у предложения ещё есть время измениться.
Обсуждение предложения
@zen_of_python