Python 在子包之间共享模块的最佳实践是什么?
假设您正在创建一个包含四个子包的python包,其中有一个模块Python 在子包之间共享模块的最佳实践是什么?,python,package,Python,Package,假设您正在创建一个包含四个子包的python包,其中有一个模块generic_stuff.py,这正是其中两个所需要的。具体来说,可能generic_stuff.py包含一些用于读取和写入数据库的自定义函数,子包1和2包含用于单独部署的web服务器的代码 问题是: 使子包1和2可用的generic_stuff.py的正确方法是什么 我可以想出三种方法,但它们都像黑客: 将generic_stuff.py作为自己软件包的一部分并安装它。这是不令人满意的,因为它污染了整个系统的名称空间(更不用说子包
generic_stuff.py
,这正是其中两个所需要的。具体来说,可能generic_stuff.py
包含一些用于读取和写入数据库的自定义函数,子包1和2包含用于单独部署的web服务器的代码
问题是:
使子包1和2可用的generic_stuff.py
的正确方法是什么
我可以想出三种方法,但它们都像黑客:
generic_stuff.py
作为自己软件包的一部分并安装它。这是不令人满意的,因为它污染了整个系统的名称空间(更不用说子包3和4)generic_stuff.py
和四个子包)添加到系统路径。这并不令人满意,因为它将父目录中的所有内容都添加到子包1和2的命名空间中。这可以通过将generic_stuff.py
放在它自己的目录中并将其添加到系统路径中来避免,但即使如此,如果子包1和2中有多个模块正在使用多个通用模块,这种方法也不能很好地扩展(想象一下尝试重构该项目)generic_stuff.py
:一份在子包1和子包2中。我需要解释为什么这是个坏主意吗我想我想到的是某种配置,可能会放在父目录的
\uuu init\uuuu.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
在所有需要通用_材料的模块中,执行以下操作:
# 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()