Функция импорта из подмодуля в __init__.py без показа подмодуля - PullRequest
0 голосов
/ 18 мая 2019

Я работаю над проектом Python со структурой каталогов, подобной этой:

foo/
├── bar
│   ├── bar1.py
│   ├── bar2.py
│   └── __init__.py
└── __init__.py

Где модуль bar1 определяет функцию function1.

Я бы хотел, чтобы пользователи моего кода импортировали function1 (и ничего больше) напрямую из foo, т.е. через from foo import function1. Достаточно справедливо, что может быть достигнуто с помощью следующего foo/__init__.py:

from .bar.bar1 import function1

__all__ = ['function1']

Проблема сейчас в том, что кто-то работает import foo, например, REPL по-прежнему будет отображаться с foo.bar рядом с foo.function1 при попытке автозаполнения foo.. Есть ли способ «скрыть» существование bar от пользователей без изменения его имени на _bar?

Я мог бы пойти по этому пути совсем неправильно, поэтому я открыт для предложений о том, как реструктурировать мой код, но я бы хотел избежать переименования модулей.

1 Ответ

1 голос
/ 18 мая 2019

Вы можете скрыть это, удалив ссылку bar в foo/__init__.py:

from .bar.bar1 import function1

__all__ = ['function1']

del bar

Наличие __all__ влияет только на поведение from <module> import *

...