1

所以这就是我要处理的:

我有一个模块 A,其中

  • 子模块 AB 包含一个名为“func1”的函数
  • 子模块 ABC 包含一个名为“func2”的函数

我还有一个带有 C 类的单独模块 B

最后,ABfunc1 通过导入语句“from B import C”使用模块 B 中的类 C

到目前为止,我学到的是,如果我这样做:

from A.B import func1

func1 将工作。

但是,如果我这样做:

from A.B import func1
from A.B.C import func2

func1 将不起作用。

在四处挖掘和尝试之后,我发现 ABfunc1 对 C 的使用会查看 func1 的全局变量以找到 C(通过它的“从 B 导入 C”放在那里)。但是,当执行“from ABC import func2”时,全局变量中的 C 条目会被覆盖。基本上,我同时拥有 ABC 和 BC 的事实混淆了全局命名空间,从而导致了这种意外失败,尽管在每个模块中代码看起来都是正确的。

但是,我不知道如何防止将来发生这种情况。我应该遵循哪些命名规则/约定来防止发生这种情况?一个激进的解决方案可能是确保你永远不会有两个同名的子模块,但我想如果有足够大的库系统,这可能很难维护。在这种情况下,其他人会怎么做?

也许我应该以不同的方式使用导入,并且做一些“从......导入......”以外的事情?

任何评论/帮助将不胜感激。

4

1 回答 1

0

这看起来像循环导入,通常您需要更好地构建项目以避免。如果必须这样做,则需要进行本地导入。另一方面,如果您有命名冲突,最简单的做法是:

import A

然后用 ABfun* 调用函数

于 2013-07-16T02:24:48.000 回答