所以这就是我正在处理的问题:
我有一个模块A,其中
- 子模块A.B包含一个名为“func1”
的函数- 子模块A.B.C包含一个名为“func2”
的函数我还有一个单独的B类模块
最后,A.B.func1使用模块B中的C类,通过导入语句“来自B import C”
到目前为止我学到的是,如果我这样做的话:
from A.B import func1
func1将起作用。
但是,如果我这样做:
from A.B import func1
from A.B.C import func2
func1无效。
在挖掘并尝试之后,我发现A.B.func1对C的使用会查看func1的全局变量以找到C(由它来自“B import C”)。但是,当执行“来自A.B.C import func2”时,会覆盖全局变量中的C条目。基本上,我同时拥有A.B.C和B.C这一事实使全局命名空间混乱,从而导致意外失败,尽管在每个模块中代码看起来都是正确的。
然而,我对如何防止将来发生这种情况感到茫然。我应该遵循哪些命名规则/惯例来防止这种情况发生?一个激烈的解决方案可能是确保你永远不会有两个具有相同名称的子模块,但我想如果有足够大的库系统,这可能很难保养。在这种情况下,其他人都做了什么?
也许我应该以不同的方式使用导入,并执行“from ... import ...”以外的其他操作?
任何评论/帮助将不胜感激。
答案 0 :(得分:0)
这看起来像循环导入,一般来说,您需要更好地构建项目以避免。如果必须这样做,那么您需要进行本地导入。另一方面,如果您有命名冲突,最简单的方法就是:
import A
然后用A.B.fun *
调用该函数