443 words
2 minutes
[DEV] 개발할 때 맨날 발생할 문제, 순환 참조
개발하다보면 어처구니 없는 문제가 종종 발생하곤 합니다. python에서는 조금 많이 발생하는 문제 중 하나가 Cyclic import 문제(다른 이름은 Circular import 문제)입니다.
예를 들기 위해서 클래스 2개를 한번 만들어 볼게요!
# human_a.py
from .human_b import *
class human_a:
    def __init__(self):
        self.b = human_b()
        return
# human_b.py
from .human_a import *
class human_b:
    def __init__(self):
        self.a = human_a()
        return
        
        
# main.py
human = human_b()
print(human.a)이러면 human = human_b() 여기부터 오류가 날겁니다.(정확히는 이걸 타고 올라가서 import 문에서 오류가 터집니다)
NameError: name 'human_a' is not defined. Did you mean: 'human_b'? 이런 문구가 올라오면서요!
이유는 human_b를 정의하기 위해서 코드로 올라갔더니 human_b를 정의하기 위해서는 human_a라는 친구가 필요했던 겁니다. 그래서 human_a를 먼저 정의하려고 했더니! human_a를 정의하려면 human_b가 필요하네요? 이 상태에 빠지면서 정의가 되지않고 터져버리는거죠.
이러한 문제가 바로 순환 참조의 문제입니다. 이러한 문제를 해결하기 위해서는 Late Import, 아니면 코드 구조 자체를 바꿔버리는 방법도 있긴 합니다.
Late import는 필요할 때 동적으로 그때그때 불러오거나, 아예 다 실행되고나서(이미 사용할 클래스가 정의된 후)에 불러오는 것을 말하고 구조 자체를 바꾼다는건 말 그대로 저런 형태의 코드를 짜지 않는 제일 좋은 상황을 말합니다.
엔진 만들다가 구조 개편하는데 정말 많은 시간을 쏟고 있는 것 같습니다. ㅠㅜㅜㅠ
[DEV] 개발할 때 맨날 발생할 문제, 순환 참조
https://compy07.github.io/Blog/posts/ai/reinforcementlearning/dev/compyengine/etc/cyclic_import/
