假设您正在创建一个包含四个子包的 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:
- 将
generic_stuff.py
作为它自己的包的一部分并安装它。这是不理想的,因为它污染了整个系统的命名空间(更不用说子包 3 和 4)。 - 在导入子包 1 和 2 之前将父目录(包含
generic_stuff.py
和四个子包)添加到系统路径。这是不令人满意的,因为它将父目录中的所有内容添加到命名空间子包 1 和 2。这可以通过将generic_stuff.py
放在它自己的目录中并将其添加到系统路径中来避免,但即便如此,如果有多个通用的,这种方法也不能很好地扩展子包 1 和 2 中的多个模块正在使用的模块(想象一下试图重构该项目)。 - 维护
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/