Python

__future__ 문 | from __future__ import annotations

토오오끼 2024. 11. 17. 22:08
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
반응형