1

我正在设计一个具有以下目录结构的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 的使用以及我对 numpy 作为 np.xml 的使用。是使用类似的东西import numpy as _npfrom ..subpackage2 import module3 as _module3最好的方法吗?

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

为了澄清,我可以在 scipy 源代码中看到文件 scipy.integrate.quadrature 中包含该行import numpy as np,但是当我import scipy在 ipython 中执行此操作时,我可以使用制表符完成 scipy.integrate.quadrature 而看不到 np

4

1 回答 1

1

在您的package/__init__.py中,包括:

import subpackage1
import subpackage2

这确保任何时候package都被导入,它也导入subpackageX, as 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 *
于 2013-05-10T04:25:06.993 回答