在子包之间共享Python模块的最佳实践是什么?

时间:2016-07-08 00:39:07

标签: python packages

假设您正在创建一个包含四个子包的python包,并且只有两个子包需要一个模块generic_stuff.py。为了使其具体化,可能generic_stuff.py包含一些用于读取和写入数据库的自定义函数,子包1和2包含要单独部署的Web服务器的代码。

问题是:

  

正确使generic_stuff.py可用于子包1和2的方法是什么?

我可以想到三种方法,但所有这些方法都像黑客一样:

  1. generic_stuff.py部分包装在自己的包中并进行安装。这是不能令人满意的,因为它污染整个系统的命名空间(更不用说子包3和4)。
  2. 在导入子包1和2之前,将父目录(包含generic_stuff.py和四个子包)添加到系统路径中。这是不能令人满意的,因为它将父目录中的所有内容添加到子包1和2的命名空间中这可以通过将generic_stuff.py放在自己的目录中并将其添加到系统路径来避免,但即使这样,如果子包中的多个模块使用多个通用模块,这种方法也不能很好地扩展1和2(想象一下试图重构该项目)。
  3. 维护generic_stuff.py的两个副本:一个在子包1和子包2中。我是否需要解释为什么这是一个坏主意?
  4. 我想我的想法是某种配置,也许会放在父目录的__init__.py或其他东西中,这会使模块X可用于子包Y.是否存在这样的配置?

1 个答案:

答案 0 :(得分:1)

也许我是某种东西,但似乎你在思考这个问题。只需将generic_stuff.py放在包的最高级别,然后将其导入sub1和sub2。你可以使用绝对或相对导入,没有名称污染没有搞乱sys.path。例如:

包结构:

package
|-- generic_stuff.py
|-- __init__.py
|-- sub1
|   |-- __init__.py
|   `-- sub1_module.py
|-- sub2
|   `-- __init__.py
|-- sub3
|   `-- __init__.py
`-- sub4
    `-- __init__.py

在需要generic_stuff的所有模块中执行以下操作:

# sub1_module.py
# import using a relative reference
import ..generic_stuff as gs
gs.some_tool()
# or an absolute reference
from package import generic_stuff as gs
gs.some_tool()