2016-07-08 50 views
2

假设您正在创建一个包含四个子包的python包,并且有一个模块generic_stuff.py,这正好是其中两个所需的模块。为了使其具有实际意义,可能generic_stuff.py包含一些用于读取和写入数据库的自定义函数,并且子包1和2包含用于要单独部署的Web服务器的代码。在子包之间共享Python模块的最佳做法是什么?

的问题是:

什么是正确的方式使generic_stuff.py提供给子包1和2?

我能想到的三种方式来做到这一点,但他们都觉得像黑客:

  1. 请自行封装generic_stuff.py一部分并进行安装。这是不令人满意的,因为它污染了整个系统的命名空间(更不用说子包3和4)。
  2. 将子目录(包含generic_stuff.py和四个子包)添加到系统路径中,然后再导入到子包1和子包2中。这并不令人满意,因为它将父目录中的所有内容添加到子包1和2的名称空间中。通过将generic_stuff.py放在其自己的目录中并将其添加到系统路径中可以避免,但即使如此,如果在子包1和2中有多个模块正在使用多个通用模块,这种方法的扩展性也不会很好(假设尝试重构该项目)。
  3. 维护generic_stuff.py的两个副本:分包1和分包2中的一个。我是否需要解释为什么这是一个坏主意?

我想什么,我心里有一些类型的配置,也许这​​将走在父目录的__init__.py或东西,这将使模块X提供给​​分装Y.是否像这样的东西存在吗?

回答

1

也许我是某个东西,但看起来好像你是在解决问题。只需将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() 
相关问题