gpt4 book ai didi

python - 干净的命名空间和 __init__.py

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:08 25 4
gpt4 key购买 nike

我正在设计一个具有以下目录结构的Python包

package\  
__init__.py
subpackage1\
__init__.py
module1.py
module2.py
subpackage2\
__init__.py
module3.py

我希望用户能够在 ipython 中导入包时探索一个干净的 namespace ,该空间可以使用制表符补全来反射(reflect)目录结构。

例如,执行完之后

import package as pkg

我想在 pkg 上完成制表符补全。显示pkg.subpackage1 pkg.subpackage2pkg.subpackage1 上的制表符补全。显示pkg.subpackage1.module1 pgk.subpackage1.module2 。其中一些模块相互依赖,包括 import statements

例如 module1.py我们有,

from ..subpackage2 import module3

但是,我不希望有人能够通过 Tab 键完成以下内容 pkg.subpackage1.module1.module3即使他们已经做了import pkg.subpackage1.module1

此外,当人们这样做时import pkg.subpackage1.module1我不想在 pkg.subpackage1.module1 上进行制表符补全。显示我的内部异常类以及我在 module1 中将 numpy 作为 np 导入的事实。换句话说,我希望对用户隐藏在 module1 中对 module3 的使用以及对 numpy 作为 np 的使用。正在使用类似 import numpy as _np 的东西和from ..subpackage2 import module3 as _module3最好的方法是做到这一点?

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

为了澄清,我可以在 scipy 源代码中看到文件 scipy.integrate.quadrature 有行 import numpy as np在其中,但是当我这样做时import scipy在 ipython 中,我可以使用 Tab 键完成 scipy.integrate.quadrature 而看不到 np

最佳答案

在您的 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 * .

关于python - 干净的命名空间和 __init__.py,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16475129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com