我想要某个模块的接口包含一定数量的函数和类(而不是其他)。我可以在一个文件中实现所有这些,并且很容易获得我想要的接口。但是,由于有大量的代码,我宁愿分裂了整个事情分成几个文件,说如何将子模块名称保留在Python包的名称空间之外?
mypackage/
__init__.py
a.py
b.py
c.py
d.py
如果想获得理想的界面,我定义一个__init__.py
文件为导入所有公共包从a
,b
,c
和d
符号:
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
如果我导入使用
import mypackage
包
包名称空间还包含符号a
,b
,c
和d
。这些名称是实现细节,不属于我的界面。我不希望它们显示为“公共”符号。什么是摆脱他们的最佳方式?
我考虑的选择是
使用一个单独的模块,而不是包装。界面看起来很好,但是实现会比现在更清晰。
行
del a, b, c, d
加入的
__init__.py
末。工作正常,但看起来像一个黑客。 (例如,你不能import __init__
更多,如果没有此项线路正常。)重命名
a
,b
,c
和d
到_a
,_b
,_c
和_d
。现在它们被包含在mypackage
的命名空间中作为“私有”符号,我很好,但它感觉有点奇怪,我的文件名以开头, )。
有什么更好的建议吗?或者想要选择哪个选项?
或者我只是为了肛门,不应该关心整个事情?
不妨去喝苏打水。也就是说,除了你以外,没有人真正关心包的命名空间中的内容。 – 2011-03-10 20:29:24
@Ignacio:可能你是对的:)例如在交互式使用中,当不需要的名称会干扰标签扩展时,它会让我感到恼火。 – 2011-03-10 20:37:21
这只是我的看法,但是'import __init__'在选项2中似乎更加骇人听闻,所有事情都考虑到了。 – JAB 2012-06-07 15:09:20