从__init__.py中的子模块导入函数,而不会暴露子模块

时间:2019-05-18 15:33:46

标签: python python-import

我正在处理一个具有类似于以下目录结构的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尝试自动完成foo.bar时,REPL仍将与foo.function1一起显示foo.。是否有一种方法可以在不将其名称更改为bar的情况下向用户“隐藏” _bar的存在?

我可能会一起以错误的方式进行操作,因此我愿意就如何重组代码提出建议,但我希望避免重命名模块。

1 个答案:

答案 0 :(得分:1)

您可以通过删除bar中的foo/__init__.py参考来隐藏它:

from .bar.bar1 import function1

__all__ = ['function1']

del bar

Existence of __all__ affects the from <module> import * behavior only