728x90
python의 __future__ 문 중에서 from __future__ import annotations는 함수나 클래스가 정의될 때 타입 힌트를 평가하지 않고 문자열 형태로 저장한다.
코드 작성과 유지보수가 훨씬 간단해지며 다음과 같은 상황에서 유용하다.
1. forward reference 간소화
두 클래스가 서로 참조해야 할 때, 타임 이름을 문자열로 감싸야 'NameError'가 발생하지 않았는데 from __future__ import annotations를 사용하면 문자열로 감쌀 필요가 없다.
class A:
def __init__(self, b: 'B'): # 문자열로 감싸야 함
self.b = b
class B:
def __init__(self, a: 'A'):
self.a = a
from __future__ import annotations
class A:
def __init__(self, b: B): # 문자열 없이도 가능
self.b = b
class B:
def __init__(self, a: A):
self.a = a
이를 통해 코드가 훨씬 간결해지고 읽기도 쉬워진다.
2. circular Import 문제 해결
여러 모듈이 서로 참조하는 상황에서 circular Import 문제가 발생할 수 있다.
from b import B
class A:
def __init__(self, b: B):
self.b = b
from a import A
class B:
def __init__(self, a: A):
self.a = a
일반적으로 위와 같은 코드는 ImportError를 유발하지만
from __future__ import annotations를 사용하면 타입 힌트 평가가 나중으로 지연되기 때문에 이런 문제를 해결할 수 있다.
from __future__ import annotations
from b import B
class A:
def __init__(self, b: B):
self.b = b
from __future__ import annotations
from a import A
class B:
def __init__(self, a: A):
self.a = a
3. 클래스 간 상호 참조
두 클래스가 서로를 참조해야 하는 경우 클래스 정의 순서를 바꾸거나 문자열을 사용하는 번거로운 작업 없이 사용가능하다.
from __future__ import annotations
class A:
def __init__(self, b: B): # B를 바로 참조 가능
self.b = b
class B:
def __init__(self, a: A): # A도 바로 참조 가능
self.a = a
이는 python 3.7부터 사용가능했으며 python 3.11부터는 기본적으로 활성화되어 있다.
python 3.11을 이용한다면 from __future__ import annotations를 하지 않아도 되지만
python 3.7 이상 python 3.10이하 버전을 쓴다면 해당 기능을 사용하여 간결하게 코드 작성을 할 수 있다.
728x90