python::circular import problem

Today lolol·2020년 8월 1일
0

mote

목록 보기
3/5

Ref list


can not import module

당연히 같은 폴더에 있고, 당연히 main.py 하위에 존재하는 파일인데 왜 가져오질 못하니... 왜 찾지를 못하니... 그래서 프로그램이 실행조차 안되잖아..

이것이 내가 직면한 문제였다. 나의 경우 singleton으로 전체 프로젝트의 주요한 모듈을 관리하는 핸들러를 만들었고, 이 녀석은 주요한 모듈들을 import했다.

그리고 singleton-module을 다른 주요한 모듈에서 이 녀석을 import하면 에러가 발생하는 것 이다.

...
# referenced stackoverflow question
# https://stackoverflow.com/questions/21503577/cannot-import-a-class
 in <module>
    from rabbits import Rabbit
ImportError: cannot import name Rabbit

이것은 비단 singleton이라는 미명 아래 쓰고 있는 모듈이 아니더라도 발생할 수 있을 것 이다. (어쩌면 python이라서 취약한걸까..)

이러한 문제를..

circular import

..라고 한다.

의미 그대로 순환되면서 호출하니 recursive하게 무한 궤도를 그리는 것 이다. 아래의 문구를 보면 더 확실하게 이해할 수 있다.

Imports are pretty straightforward really. Just remember the following:
'import' and 'from xxx import yyy' are executable statements. They execute when the running program reaches that line.
...
If a module does exist in sys.modules then an import simply returns that module whether or not it has completed executing. That is the reason why cyclic imports may return modules which appear to be partly empty.

정리하자면, import를 한다는 의미는 해당 .py를 실행한다는 의미이고 이것은 순환하면서 실행되다가 sys.modules에 속하지 않는 모듈이라면, 이 모듈이 완전히 실행되든 아니든 반환하게 되어 빈 모듈을 반환한다는 것 이다.
그렇기에 rabbit은 찾았으나, Rabbit은 찾지 못하는 것이다.
.py 파일은 찾았는데, class는 찾지 못한 것 이다.

이 경우가 생긴다는 것은 구조화를 잘못했다는 반증일 수도 있지 않을까라는 생각이 든다...

profile
working making doing makes us 🤖

0개의 댓글