如何将子模块名称保留在Python包的名称空间之外?

Sve*_*ach 12 python module package

我希望某个模块的接口包含一定数量的函数和类(没有别的).我可以在一个文件中实现所有这些,并且可以轻松获得我想要的界面.但是,由于存在大量代码,我宁愿将整个内容分成几个文件,比如说

mypackage/
    __init__.py
    a.py
    b.py
    c.py
    d.py
Run Code Online (Sandbox Code Playgroud)

为了获得所需的接口,无论如何,我定义__init__.py为进口所有公共符号从包文件a,b,cd:

from a import func_a1, func_a2, ClassA1, ClassA2
from b import func_b1, func_b2, ClassB1, ClassB2
from c import func_c1, func_c2, ClassC1, ClassC2
from d import func_d1, func_d2, ClassD1, ClassD2
Run Code Online (Sandbox Code Playgroud)

如果我使用导入包

import mypackage
Run Code Online (Sandbox Code Playgroud)

包命名空间还包含符号a,b,cd.这些名称是实现细节,而不是我的界面的一部分.我不希望它们显示为"公共"符号.摆脱它们的最佳方法是什么?

我考虑的选项是

  1. 使用单个模块而不是包.界面看起来很好,但实现将不如现在清晰.

  2. 添加行

    del a, b, c, d
    
    Run Code Online (Sandbox Code Playgroud)

    到了最后__init__.py.工作正常,但似乎是一个黑客.(例如,你不能再import __init__这样了,没有这条线也可以.)

  3. 重命名a,b,cd_a,_b,_c_d.现在它们mypackage作为"私有"符号被包含在命名空间中,我很好,但是我觉得有点奇怪,我的所有文件名都以下划线开头(实际上,当然有四个以上的子模块).

有更好的建议吗?或者想要选择哪个选项?

或者我只是肛门,不应该关心整个事情?

Eth*_*man 12

如果包中的某些文件确实是实现细节,请继续在它们前面加上下划线 - 这就是我们使用它们的原因.

例如,如果你看,ctypes你会看到

__init__.py
==================================================
"""create and manipulate C data types in Python"""

import os as _os, sys as _sys

__version__ = "1.1.0"

from _ctypes import Union, Structure, Array
from _ctypes import _Pointer
from _ctypes import CFuncPtr as _CFuncPtr
...
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,甚至ossys他是这个文件的实施细则.


Ign*_*ams 5

如果您确实想从名称空间中删除名称,则可以del对它们使用语句,它们会随风消失。