Скажем, у меня есть следующая структура каталогов пакета Python:
package
sample/
__init__.py
a.py
Где sample/a.py
содержит несколько функций:
def _a(x):
...
return some_result
def _b():
return 7
def a(x):
"""
Wrapper for `_a()`
"""
return _a(x)
def c():
return _b()
Обычно для вызова a()
, ябудет делать:
import sample as smp
smp.a.a(5)
Но чтобы сделать его немного проще и потребовать меньше набирать текст (поскольку имена моих модулей и имена функций намного длиннее), я мог бы изменить файл sample/__init__.py
с помощью:
from .a import a
И теперь я могу сделать:
import sample as smp
smp.a(5)
Однако бывают случаи, когда мне нужно вызывать некоторые другие функции, такие как _b()
или c()
(т. Е. Для некоторыхмодульные тесты), но я не хочу, чтобы эти функции были (легко) доступны пользователю как smp._b()
или smp.c()
.Таким образом, изменение sample/__init__.py
следующим: нежелательно :
from .a import a, _b, c
Вместо этого я хочу, чтобы другие функции были доступны только таким образом:
import sample as smp
smp.a(5)
# The following lines will error out
smp.a._(5)
smp.a._b()
smp.a.c()
Однако это невозможно, поскольку smp.a
уже определено как функция, а не как имя модуля.Как я могу сделать это, не перемещая дополнительные функции в отдельный файл?