포스트

Python에서 메서드에 같은 클래스 타입을 힌트로 사용하는 방법

문제 상황: “NameError: name ‘Classname’ is not defined”

Python에서 클래스를 정의할 때, 해당 클래스의 메서드가 같은 클래스의 인스턴스를 인자로 받거나 반환해야 하는 경우가 있습니다. 이때 클래스 내부에서 자기 자신의 타입을 힌트로 지정하려고 하면, 종종 NameError: name 'Classname' is not defined 이라는 오류가 발생합니다.

“from future import annotations” 사용하기

Python 3.7 이상에서는 from __future__ import annotations를 사용하여 이 문제를 해결할 수 있습니다. 이 코드를 파일의 맨 위에 추가하면, 아직 정의되지 않은 타입을 힌트로 사용할 수 있게 됩니다.

1
2
3
4
5
from __future__ import annotations

class MyClass:
    def my_method(self, param: MyClass) -> MyClass:
        return param

“TYPE_CHECKING” 활용하기

typing 모듈의 TYPE_CHECKING을 사용하면, 타입 검사기가 실행될 때만 특정 코드가 수행되도록 설정할 수 있습니다. 이렇게 하면 런타임에서는 NameError를 피할 수 있습니다.

1
2
3
4
5
6
7
8
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from . import MyClass  # 여기서 '.'는 현재 패키지를 의미합니다.

class MyClass:
    def my_method(self, param: MyClass) -> MyClass:
        return param

문자열 사용하기

Python 3.5 이상에서는 타입 힌트로 클래스 이름을 문자열로 감싸서 사용할 수 있습니다.

1
2
3
class MyClass:
    def my_method(self, param: 'MyClass') -> 'MyClass':
        return param

이렇게 해서, Python에서 메서드에 같은 클래스 타입을 힌트로 지정하는 다양한 방법을 살펴보았습니다. 이 문제를 해결하는 가장 적합한 방법은 사용하고 있는 Python의 버전과 프로젝트의 요구사항에 따라 다를 수 있으니, 상황에 맞게 선택하세요.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.