好吧,这一点也不太清楚。请允许我换个说法。
快速笔记:写这个问题时“解决了”。将接受应答,并输入关于最佳实践__的输入。
原始快速笔记:这可能是一个复制。我显然不能很好地表达这个问题,以适应这种情况。如果是的话我很抱歉。
首先,为了使您处于有利位置,下面是我的项目的层次结构以及一些相关代码:
Project/
├── main.py
└── lib
├── __init__.py
├── A.py
├── B.py
└── C.pymain.py
## Imports
from lib.A import ClassA as clA
from lib.B import ClassB as clB
from lib.C import ClassC as clC
#
# ... Some other code ...
#
a = clA()
b = clB()
a.add_ClB_Inst_Ref(b)A.py
## Imports
if __name__ == "__main__":
from B import ClassB as clB
from C import ClassC as clC
class ClassA:
dict_Of_Weighted_ClB_Refs = {}
#
# ... Some other code (attributes, init, ...) ...
#
def add_ClB_Inst_Ref(self, ClB_Instance):
if isinstance(ClB_Instance, clB):
key = clB.ID
if key in self.dict_Of_Weighted_ClB_Refs:
self.dict_Of_Weighted_ClB_Refs[key] +=1
else:
self.dict_Of_Weighted_ClB_Refs[key] = 1问题:
当检查方法的参数是ClassB对象的实例时,程序在ClassB方法中崩溃,错误如下:
NameError: name 'clB' is not defined“好吧”,你可能会说,“当然,它崩溃了,A.py文件从来没有听说过那个花哨的clB__!”而且,是的,这可能是问题所在,但是当我试图在这个文件中导入它时,将imports部分替换为:
## Imports
from B import ClassB as clB
from C import ClassC as clC我得到以下错误:ImportError: No module named 'B'
问题:
我怎么才能解决这个问题?欢迎你对最佳做法的投入。
怀疑:
所有这些都让我想到了这样的假设:
import从执行初始脚本的位置搜索匹配。(Note:这会导致我再次检查我是否尝试过这样做,from lib.B import ClassB as clB就像在主文件中一样;事实证明,我没有这样做,这很有效.我明白逻辑,但这似乎是违反直觉的。详见下面的答案。发布于 2016-08-19 10:44:57
正如问题中所指出的,下面是修复模块A中不可用模块B的问题所需要的。
只需将A.py中的imports部分替换为:
## Imports
if __name__ == "__main__":
from B import ClassB as clB
from C import ClassC as clC
else:
from lib.B import ClassB as clB
from lib.C import ClassC as clC对我来说,这似乎不是最好的解决方案,因为这意味着每次从lib文件夹以外的地方调用模块时,它都假设这个“某处”是项目的根文件夹,这可能会导致一些严重的冲突。
如果你能在这个问题上提供一个更一般的方法和/或最佳实践,请写你自己的答案。
https://stackoverflow.com/questions/39037069
复制相似问题