python - 为什么循环导入似乎在调用堆栈中更靠前,但在更靠下的位置引发 ImportError?

标签 python import circular-dependency

我收到了这个错误

Traceback (most recent call last):
  File "/Users/alex/dev/runswift/utils/sim2014/simulator.py", line 3, in <module>
    from world import World
  File "/Users/alex/dev/runswift/utils/sim2014/world.py", line 2, in <module>
    from entities.field import Field
  File "/Users/alex/dev/runswift/utils/sim2014/entities/field.py", line 2, in <module>
    from entities.goal import Goal
  File "/Users/alex/dev/runswift/utils/sim2014/entities/goal.py", line 2, in <module>
    from entities.post import Post
  File "/Users/alex/dev/runswift/utils/sim2014/entities/post.py", line 4, in <module>
    from physics import PostBody
  File "/Users/alex/dev/runswift/utils/sim2014/physics.py", line 21, in <module>
    from entities.post import Post
ImportError: cannot import name Post

你可以看到我进一步使用相同的导入语句并且它有效。循环进口有什么不成文的规定吗?如何在调用堆栈的下方使用相同的类?


另见What happens when using mutual or circular (cyclic) imports in Python?有关允许的内容以及导致 WRT 循环导入问题的原因的一般概述。见 What can I do about "ImportError: Cannot import name X" or "AttributeError: ... (most likely due to a circular import)"?用于解决和避免循环依赖的技术。

最佳答案

我认为 answer by jpmc26 ,虽然绝不是,但对循环导入的影响太大了。如果您正确设置它们,它们可以正常工作。

最简单的方法是使用 import my_module 语法,而不是 from my_module import some_object。前者几乎总是有效,即使 my_module 包含导入我们回来。后者仅适用于 my_object 已在 my_module 中定义的情况,而循环导入可能并非如此。

具体到您的情况:尝试更改 entities/post.py 以执行 import Physics 然后引用 physics.PostBody 而不是而不仅仅是 PostBody 直接。同样,将 physics.py 更改为 importentities.post 然后使用 entities.post.Post 而不仅仅是 Post.

关于python - 为什么循环导入似乎在调用堆栈中更靠前,但在更靠下的位置引发 ImportError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187279/

相关文章:

python - Pandas :每个日期的频率以列表的形式按列分组

python - 我无法从程序中获取授权码

mysql - 如何在不使用任何付费工具的情况下将 dbf 文件导入 mysql?

python - 在这种情况下如何配置 __init__.py?

python - 为什么 += 添加和 int.从一个列表到另一个列表而不仅仅是+?

javascript - require() 相当于 if import { Something } from 'somewhere'

import - angular 2 种子,webstorm 2016.1 突然停止导入库

c++ - 惰性符号绑定(bind)失败 : symbol not found

.net - 在 .NET 框架中遇到自递归程序集引用

c++ - C++ header 中的循环依赖。怎么找?