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

6
假设您正在创建一个具有四个子包的Python软件包,并且有一个模块generic_stuff.py,恰好需要其中两个子包。为了使其具体化,也许generic_stuff.py包含一些用于从数据库读取和写入的自定义函数,而子包1和2包含用于部署Web服务器的代码。
问题是:
正确的方法是什么,使generic_stuff.py可用于子包1和2?
我可以想到三种方法,但它们都感觉像是hack:
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中。我需要解释为什么这是一个坏主意吗?
我想我心中的想法是一种配置,可能会进入父目录的__init__.py或其他地方,可以使模块X可用于subpackage Y。类似这样的东西存在吗?
1个回答

5
也许我能提供一些帮助,但看起来你可能过度思考了这个问题。简单地将 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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接