PYTHONPATH中的包及其子包都将中断什么?

时间:2018-08-10 18:41:52

标签: python python-import python-module python-packaging

我们有一个结构如下的软件包:

ParentDirectory/
  Able/
    __init__.py
    Baker/
      __init__.py
      stuff.py
      Charlie/
        __init__.py
        things.py

和PYTHONPATH中的ParentDirectory一起,Charlie以常规方式导入: from Able.Baker import Charlie

我的一位同事希望使PYTHONPATH包含“ ParentDirectory;ParentDirectory/Able;ParentDirectory/Able/Baker”,以便他们可以直接导入Baker和Charlie,就像它们是顶级的一样:

import Able
import Baker
import Charlie

这会破坏一切吗?

(对我来说,这似乎是一种不好的做法,但我无法明确说明其不好的具体原因。)

1 个答案:

答案 0 :(得分:3)

这绝对会破坏事情。如果这样做,BakerCharlie将是与Able.BakerAble.Baker.Charlie不同的模块。导入BakerAble.Baker将运行两次模块初始化。您将有两个类的副本(以及函数和大多数其他东西,但是对于类来说效果更糟)。您将中断相对导入,因为BakerCharlie将是顶级的,而不是包内的。这是一个可怕的主意。