__all__
в модуле, чтобы явно указать список публичных имен (переменных, функций, классов), которые будут экспортироваться при импорте модуля с использованием from module import *
. Если __all__
не определен, по умолчанию экспортируются все имена, не начинающиеся с подчеркивания (_
). Определение __all__
улучшает читаемость кода и предотвращает случайный экспорт внутренних компонентов.
__all__
- это список строк, определяющий публичный интерфейс модуля. Он используется, когда из модуля делается импорт с использованием from module import *
. Если __all__
определен, то при такой форме импорта будут импортированы только имена, перечисленные в этом списке.
Зачем использовать __all__
?
__all__
, остается неизменным.Как использовать __all__
:
__all__
в начале модуля: В начале файла модуля присвойте переменной __all__
список строк, содержащий имена, которые вы хотите сделать публичными.__all__
должен содержать только строки, представляющие имена функций, классов, переменных и т.д., которые вы хотите экспортировать.Пример:
# my_module.py
__all__ = ['public_function', 'MyPublicClass']
def public_function(x):
"""Эта функция является частью публичного API."""
return x * 2
class MyPublicClass:
"""Этот класс является частью публичного API."""
def __init__(self, value):
self.value = value
def _private_function(): # Функция с префиксом "_" - обычно считается приватной
"""Эта функция не должна быть частью публичного API."""
pass
MY_PUBLIC_CONSTANT = 10
Использование:
# main.py
from my_module import *
print(public_function(5)) # Работает
my_object = MyPublicClass(20) # Работает
print(MY_PUBLIC_CONSTANT) # Будет работать, т.к. не был указан в __all__
# _private_function() # Вызовет NameError, так как '_private_function' не была экспортирована.
Важно:
__all__
не определен, то при from module import *
будут импортированы все имена, которые не начинаются с символа подчеркивания (_
).__all__
, то импортируются только те имена, которые явно указаны в этом списке, даже если другие имена не начинаются с _
.В заключение, использование __all__
позволяет вам явно контролировать публичный API вашего модуля, что приводит к более поддерживаемому, читаемому и безопасному коду.