在 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'

问题:

我该如何解决这个问题?我们非常欢迎您就最佳做法发表意见。

怀疑:

所有这些使我得出以下假设:

如问题中所述,这是解决模块 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最佳实践,请写下您自己的答案。