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

Python 在子包之间共享模块的最佳实践是什么?,python,package,Python,Package,假设您正在创建一个包含四个子包的python包,其中有一个模块generic_stuff.py,这正是其中两个所需要的。具体来说,可能generic_stuff.py包含一些用于读取和写入数据库的自定义函数,子包1和2包含用于单独部署的web服务器的代码 问题是: 使子包1和2可用的generic_stuff.py的正确方法是什么 我可以想出三种方法,但它们都像黑客: 将generic_stuff.py作为自己软件包的一部分并安装它。这是不令人满意的,因为它污染了整个系统的名称空间(更不用说子包

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

问题是:

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

我可以想出三种方法,但它们都像黑客:

  • generic_stuff.py
    作为自己软件包的一部分并安装它。这是不令人满意的,因为它污染了整个系统的名称空间(更不用说子包3和4)
  • 在导入子包1和2之前,将父目录(包含
    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()