在Python中存在循环导入依赖

9 浏览
0 Comments

在Python中存在循环导入依赖

这个问题已经有了答案:

如何解决“ImportError: 无法导入名称X”或“AttributeError: ...(很可能是由于循环导入)” ?

假设我有以下目录结构:

a\
    __init__.py
    b\
        __init__.py
        c\
            __init__.py
            c_file.py
        d\
            __init__.py
            d_file.py

a 包的__init__.py中,会导入c 包。 但是c_file.py导入了a.b.d

程序失败,提示当c_file.py尝试导入a.b.d 时,b 不存在。(确实不存在,因为我们正在中途导入它。)

如何解决这个问题?

admin 更改状态以发布 2023年5月21日
0
0 Comments

\n\n\n如果 a 依赖于 c,而 c 又依赖于 a,那么它们不就是同一个单元吗?\n\n真的需要仔细考虑为什么把 a 和 c 拆成了两个包,因为要么你有一些代码需要拆分到另一个包中(让它们都依赖于那个新包,而不是彼此依赖),要么就应该将它们合并成一个包。

0
0 Comments

你可以推迟导入,例如在a/__init__.py中:

def my_function():
    from a.b.c import Blah
    return Blah()

也就是说,推迟导入直到真正需要。但是,我也会仔细查看我的包的定义和用法,因为像所指出的循环依赖可能表明设计问题。

0