在 Python 中:导入恶作剧(在文件夹中导入 subfolder.module,在 subfolder/module2.py 中使用)
In Python: imports shenanigans (import subfolder.module in folder, use in subfolder/module2.py)
好吧,这不是很清楚。请允许我重新措辞。
速记:写这个问题时“已解决”。将接受 answer 以及关于最佳做法的意见。
原始速记:这可能是重复的。我显然无法很好地表达这个问题以适应这种情况。如果是,我很抱歉。
首先,为了让您定位,这是我的项目的层次结构以及一些相关代码:
Project/
├── main.py
└── lib
├── __init__.py
├── A.py
├── B.py
└── C.py
main.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
问题:
程序在add_ClB_Inst_Ref
方法中检查方法的参数是否为ClassB对象的实例时崩溃,并出现以下错误:
NameError: name 'clB' is not defined
“嗯”,你可能会说,“当然会崩溃,A.py
文件没听说过这么花哨的clB
!"。
而且,是的,这可能是问题所在,但是当我尝试将其导入到此文件中时,将导入部分替换为:
## Imports
from B import ClassB as clB
from C import ClassC as clC
我收到以下错误:ImportError: No module named 'B'
问题:
我该如何解决这个问题?我们非常欢迎您就最佳做法发表意见。
怀疑:
所有这些使我得出以下假设:
- 导入到项目根目录文件中的模块在程序执行期间不是全局可用的。
import
从执行初始脚本的位置搜索匹配项。 (注意:这让我仔细检查我是否以这种方式尝试过 from lib.B import ClassB as clB
就像在主文件中一样;事实证明我没有,这有效......我明白了逻辑,但它似乎很违反直觉。有关详细信息,请参阅下面的答案。)
- 我的项目架构有缺陷。
如问题中所述,这是解决模块 A 中模块 B 不可用问题所需要的。
只需将 A.py
中的导入部分替换为以下内容:
## 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
文件夹以外的其他地方调用模块时,它假定这个“某处”是项目的根目录文件夹,这可能会导致一些严重的冲突。
如果您能够就此问题提供更通用的方法and/or最佳实践,请写下您自己的答案。
好吧,这不是很清楚。请允许我重新措辞。
速记:写这个问题时“已解决”。将接受 answer 以及关于最佳做法的意见。
原始速记:这可能是重复的。我显然无法很好地表达这个问题以适应这种情况。如果是,我很抱歉。
首先,为了让您定位,这是我的项目的层次结构以及一些相关代码:
Project/
├── main.py
└── lib
├── __init__.py
├── A.py
├── B.py
└── C.py
main.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
问题:
程序在add_ClB_Inst_Ref
方法中检查方法的参数是否为ClassB对象的实例时崩溃,并出现以下错误:
NameError: name 'clB' is not defined
“嗯”,你可能会说,“当然会崩溃,A.py
文件没听说过这么花哨的clB
!"。
而且,是的,这可能是问题所在,但是当我尝试将其导入到此文件中时,将导入部分替换为:
## Imports
from B import ClassB as clB
from C import ClassC as clC
我收到以下错误:ImportError: No module named 'B'
问题:
我该如何解决这个问题?我们非常欢迎您就最佳做法发表意见。
怀疑:
所有这些使我得出以下假设:
- 导入到项目根目录文件中的模块在程序执行期间不是全局可用的。
import
从执行初始脚本的位置搜索匹配项。 (注意:这让我仔细检查我是否以这种方式尝试过from lib.B import ClassB as clB
就像在主文件中一样;事实证明我没有,这有效......我明白了逻辑,但它似乎很违反直觉。有关详细信息,请参阅下面的答案。)- 我的项目架构有缺陷。
如问题中所述,这是解决模块 A 中模块 B 不可用问题所需要的。
只需将 A.py
中的导入部分替换为以下内容:
## 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
文件夹以外的其他地方调用模块时,它假定这个“某处”是项目的根目录文件夹,这可能会导致一些严重的冲突。