Как сохранить пространство имен в чистоте с помощью относительного импорта с псевдонимами внутри пакета? - PullRequest
0 голосов
/ 19 марта 2020

У меня есть пакет python со следующей структурой:

└── my_package
    ├── __init__.py
    ├── __init__.pyc
    ├── module_a.py
    └── module_a.pyc

И следующее содержимое:

# __init__.py
from . import module_a as _module_a
# module_a.py
var_1 = "module_a.var_1"


def module_a_func():
    print("module_a.module_a_func")

Когда я запускаю Python и импортирую В пакете я получаю псевдоним и обычное имя импортируемого модуля в пространстве имен пакета:

Python 2.7.15+ (default, Oct  7 2019, 17:39:04)
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_package
>>> dir(my_package)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '_module_a', 'module_a']

Этого не происходит, если вы делаете то же самое для стандартного системного модуля:

Python 2.7.15+ (default, Oct  7 2019, 17:39:04)
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os.path as _p
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', '_p']

Это происходит как для Python2, так и Python3, и я попробовал это на macOS и WSL.

В качестве обходного пути я попытался просто удалить имя в импорте:

from . import module_a as _module_a
del module_a

Это работает, как и ожидалось, но также как-то прерывает перезагрузку, потому что механизм перезагрузки ищет исходное имя пакета. Однако тот же сценарий не нарушает работу стандартного системного модуля:

Python 2.7.15+ (default, Oct  7 2019, 17:39:04)
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from os import path as _p
>>> import os.path
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', '_p', 'os']
>>> del os
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', '_p']
>>> reload(_p)
<module 'posixpath' from '/usr/lib/python2.7/posixpath.pyc'>

TLDR: Как выполнить относительный импорт модуля с псевдонимом внутри Python Пакет и не должен ли он ввести как псевдоним и обычное имя модуля в пространство имен?

...