티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
Why do circular imports seemingly work further up in the call stack but then raise an ImportError further down?
왜 순환 참조가 상위 호출 스택에서는 작동하지만 하위에서 ImportError를 발생시키나요?
문제 내용
I'm getting this error
제가 이런 오류를 만났습니다.
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
and you can see that I use the same import statement further up and it works. Is there some unwritten rule about circular importing? How do I use the same class further down the call stack?
그리고 상위에서 동일한 가져오기 문을 사용하고 작동합니다. 순환 참조에 대한 암묵적인 규칙이 있나요? 호출 스택 아래에서 동일한 클래스를 사용하려면 어떻게해야 하나요?
See also What happens when using mutual or circular (cyclic) imports in Python? for a general overview of what is allowed and what causes a problem WRT circular imports. See What can I do about "ImportError: Cannot import name X" or "AttributeError: ... (most likely due to a circular import)"? for techniques for resolving and avoiding circular dependencies.
Python에서 상호 또는 순환(주기적) 가져오기를 사용할 때 발생하는 문제에 대한 일반적인 개요를 위해 "What happens when using mutual or circular (cyclic) imports in Python?"을 참조하십시오. 순환 종속성을 해결하고 피하는 기술에 대한 기술은 "What can I do about "ImportError: Cannot import name X" or "AttributeError: ... (most likely due to a circular import)"?"에서 찾을 수 있습니다.
높은 점수를 받은 Solution
I think the answer by jpmc26, while by no means wrong, comes down too heavily on circular imports. They can work just fine, if you set them up correctly.
jpmc26 답변은 단언컨대 잘못된 것은 아니지만 순환 참조에 대해서 지나치게 비판적인 면이 있다고 생각합니다. 제대로 설정하면 문제없이 작동할 수 있습니다.
The easiest way to do so is to use import my_module
syntax, rather than from my_module import some_object
. The former will almost always work, even if my_module
included imports us back. The latter only works if my_object
is already defined in my_module
, which in a circular import may not be the case.
가장 쉬운 방법은 from my_module import some_object 대신 import my_module 구문을 사용하는 것입니다. 후자는 my_module이 우리를 다시 가져오는 경우에도 거의 항상 작동합니다. 후자는 순환 참조에서 my_module에 이미 정의 된 경우에만 작동합니다.
To be specific to your case: Try changing entities/post.py
to do import physics
and then refer to physics.PostBody
rather than just PostBody
directly. Similarly, change physics.py
to do import entities.post
and then use entities.post.Post
rather than just Post
.
당신의 경우에 특정하게 말하자면, entities/post.py를 import physics로 변경하고 physics.PostBody 대신 physics.PostBody를 참조하십시오. 마찬가지로 physics.py를 entities.post를 가져와서 entities.post.Post 대신 그냥 Post를 사용하는 대신 entities.post.Post를 사용하십시오.
가장 최근 달린 Solution
I was able to import the module within the function (only) that would require the objects from this module:
해당 모듈에서 필요한 객체를 사용하는 함수 내에서 모듈을 가져올 수 있었습니다. (단지 그 함수 내에서만 가능합니다.)
def my_func():
import Foo
foo_instance = Foo()
출처 : https://stackoverflow.com/questions/22187279/why-do-circular-imports-seemingly-work-further-up-in-the-call-stack-but-then-rai
'개발 > 파이썬' 카테고리의 다른 글
문자열 리스트를 쉼표로 구분된 문자열로 만들기 (0) | 2023.01.19 |
---|---|
딕셔너리에 딕셔너리 추가하기 (0) | 2023.01.19 |
파이썬에서 새로운 딕셔너리 만들기 (0) | 2023.01.18 |
Python dictionary를 dataframe으로 변환하는 방법 (0) | 2023.01.16 |
두 개의 딕셔너리 하나로 합치기(동일 키가 있을 경우에는 값을 더해서 합치기) (0) | 2023.01.15 |