我正在设计一个具有以下目录结构的python包
package\
__init__.py
subpackage1\
__init__.py
module1.py
module2.py
subpackage2\
__init__.py
module3.py
我希望用户能够在ipython中导入包时使用制表符完成来探索反映目录结构的干净名称空间。
例如,在完成
之后import package as pkg
我想在pkg上完成标签。在pkg.subpackage1 pkg.subpackage2
上显示pkg.subpackage1
和标签完成情况。显示pkg.subpackage1.module1 pgk.subpackage1.module2
。其中一些模块相互依赖,包括import statements
。
例如我们有module1.py
,
from ..subpackage2 import module3
但是,即使他们已完成pkg.subpackage1.module1.module3
,我也不希望有人能够标记完成以下import pkg.subpackage1.module1
。
此外,当人们import pkg.subpackage1.module1
时,我不希望pkg.subpackage1.module1
上的标签已完成。显示像我的内部异常类和我在module1中将numpy导入为np的事实。换句话说,我希望我在module1中对module3的使用对用户隐藏,以及我对nump的使用numpy。使用import numpy as _np
和from ..subpackage2 import module3 as _module3
之类的东西是最好的方法吗?
我是否必须在我不希望他们看到的所有内容前加下划线?
为了澄清,我可以在scipy源代码中看到文件scipy.integrate.quadrature中包含行import numpy as np
,但是当我在ipython中执行import scipy
时,我可以选项卡完成scipy.integrate.quadrature而不是看到np
答案 0 :(得分:1)
在package/__init__.py
中,请添加:
import subpackage1
import subpackage2
这可以确保导入package
的任何时候,它还会subpackageX
导入package.subpackageX
。
在subpackageX/__init__.py
中,您不包含任何内容。因此,为了定义package.subpackageX.moduleX
,必须明确导入它(例如from package.subpackage1 import module1
)
请注意,如果采用下划线方法,在ipython中,如果执行package.subpackage1._<TAB>
,仍然可以使用下划线标记完成名称。
编辑:
其他替代方案:
subpackage1/__init__.py
中,导入要公开的名称,
例如from .module1 import x,y
。这将使它们被定义为
package.subpackage1.x
,而不是package.subpackage1.module1.x
__all__
指令定义名称。这不会影响制表完成,但会以一种说明方式说出进口商应该感兴趣的东西。这样,他们也可以from package.subpackage1 import *
。