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

标签 python package

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

问题是:

What is the right way to make generic_stuff.py available to subpackages 1 and 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 可用于子包 Y。做任何类似的事情这个存在吗?

最佳答案

也许我是什么,但你似乎想多了这个问题。只需将 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()

关于python - 在子包之间共享模块的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38257342/

相关文章:

python - 如何在Python中使用Setuptools正确打包项目?

python - 一个包内的多个子包

r - 如何在 R 包命名空间文件中正确使用 useDynLib()

python - 从另一个包导入 python 模块

python - 安装匀称: OSError: [WinError 126] The specified module could not be found

python - 导入 python 模块的特殊性?

database - Python:来自 CSV 数据的惰性数据库?

python - Qt 和 Python,在哪里配置信号和槽

python - vscode django调试报错: Couldn't import Django

python - 如何在Python/Kivy中实现ScrollView