«_func» не импортируется, даже если он объявлен в __all__Python

Программы на Python
Anonymous
«_func» не импортируется, даже если он объявлен в __all__

Сообщение Anonymous »

Я использую Python 2.
Мне удалось обнаружить, что __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

где:

Код: Выделить всё

from ._internal_module import * # Should import _functions from __all__??

Код: Выделить всё

__all__ = [
# functions:
'extl_func1',

# _functions:
'_intl_func1',
]

def extl_func1(*args, **kwargs):
pass
def _intl_func1(*args, **kwargs):
pass

Код: Выделить всё

from .external_module import *

Код: Выделить всё

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
При запуске я получаю сообщение об ошибке, что _int_func1 не существует, хотя он явно указан в __all__:

Код: Выделить всё

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
Одобрено ли это PEP 8?
Краткое описание: поместите _function в __all__, но она не была передана из импорт модуля *.

Подробнее здесь: https://stackoverflow.com/questions/769 ... red-in-all

Вернуться в «Python»