У меня есть пакет 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 Пакет и не должен ли он ввести как псевдоним и обычное имя модуля в пространство имен?