Мне удалось обнаружить, что __all__ по умолчанию не передает _functions (подчеркнутые «внутренние» функции), когда __all__ не объявлен (т. е. просто используется из модуля import *, но без явного определения __all__). Однако я также вижу, что _functions не передаются, даже если они добавлены в __all__.
Какие слова мне не хватает в моем вопросе, чтобы найти ответить на это? Является ли это постоянной «проблемой» (или ожидаемым поведением?) в Python 3?
Мой пример:
У меня есть смесь внутренних и внешние функции, которые я создаю. В настоящее время я решил эту проблему, поместив _functions (подчеркнутые функции, также известные как «внутренние функции», переименованные без подчеркивания) в ._internal_module_folder, а затем импортировав файл . _internal_module_folder во внешний_модуль и добавьте внешние функции в __all__ external_module, но оставьте внутренние функции.
Итак, мои исходное дерево (с проблемой) будет выглядеть примерно так:
Код: Выделить всё
modules_folder/
|---- __init__.py
|---- external_module.py
|---- _internal_module_folder/
|-------- __init__.py
|-------- _internal_module.py
- содержит:
Код: Выделить всё
modules_folder/_internal_module_folder/__init__.py
Код: Выделить всё
from ._internal_module import * # Should import _functions from __all__??
- содержит:
Код: Выделить всё
modules_folder/_internal_module_folder/internal_module.py
Код: Выделить всё
__all__ = [
# functions:
'extl_func1',
# _functions:
'_intl_func1',
]
def extl_func1(*args, **kwargs):
pass
def _intl_func1(*args, **kwargs):
pass
- содержит:
Код: Выделить всё
modules_folder/__init__.py
Код: Выделить всё
from .external_module import *
- содержит:
Код: Выделить всё
modules_folder/external_module.py
Код: Выделить всё
from ._internal_module_folder import *
__all__ = [
# functions:
'extl_func1', # from _internal_module_folder
'extl_func2',
]
def extl_func2(*args, **kwargs):
_intl_func1()
def _intl_func2(*args, **kwargs):
pass
Код: Выделить всё
NameError: name '_intl_func1' is not defined- Я переименовал _intl_func в intl_func< /li>
Я изменил импорт в groups_folder/__init__.py на
Код: Выделить всё
from . import _internal_module as im
- Затем я назначил псевдонимы внутренним функциям при вызове.
Код: Выделить всё
from . import _internal_module_folder as im
__all__ = [
# functions:
'extl_func1', # from _internal_module_folder
'extl_func2',
]
# Aliasing the internal module functions to pass to __all__:
extl_func1 = im.extl_func1
def extl_func2(*args, **kwargs):
im.intl_func1
def _intl_func2(*args, **kwargs):
pass
Краткое описание: поместите _function в __all__, но она не была передана из импорт модуля *.
Подробнее здесь: https://stackoverflow.com/questions/769 ... red-in-all