清理名称空间和__init__.py

时间:2013-05-10 04:20:32

标签: python import

我正在设计一个具有以下目录结构的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 _npfrom ..subpackage2 import module3 as _module3之类的东西是最好的方法吗?

我是否必须在我不希望他们看到的所有内容前加下划线?

为了澄清,我可以在scipy源代码中看到文件scipy.integrate.quadrature中包含行import numpy as np,但是当我在ipython中执行import scipy时,我可以选项卡完成scipy.integrate.quadrature而不是看到np

1 个答案:

答案 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>,仍然可以使用下划线标记完成名称。

编辑:

其他替代方案:

  1. subpackage1/__init__.py中,导入要公开的名称, 例如from .module1 import x,y。这将使它们被定义为 package.subpackage1.x,而不是package.subpackage1.module1.x
  2. 使用__all__指令定义名称。这不会影响制表完成,但会以一种说明方式说出进口商应该感兴趣的东西。这样,他们也可以from package.subpackage1 import *