본문 바로가기

About/Python

[Python] 어노테이션(Annotation)에 대하여

어노테이션(Annotation)


PEP-3107에서는 어노테이션을 소개합니다. 

https://peps.python.org/pep-3107/

 

PEP 3107 – Function Annotations | peps.python.org

PEP 3107 – Function Annotations PEP 3107 Title Function Annotations Author Collin Winter , Tony Lownds Status Final Type Standards Track Created 02-Dec-2006 Python-Version 3.0 Post-History Contents This PEP introduces a syntax for adding arbitrary metada

peps.python.org

기본 아이디어는 코드 사용자에게 함수 인자로 어떤 값이 와야 하는지 힌트를 주자는 것입니다. 어노테이션은 타입 힌팅(type hinting)을 활성화 합니다.

어노테이션을 사용해 변수의 예상 타입을 지정할 수 있습니다. 실제로는 타입 뿐 아니라 변수를 이해하는 데 도움이 되는 어떤 메타데이터라도 지정할 수 있습니다.

# 어노테이션 예시
class Point:
    def __init__(self, lat, long):
        self.lat = lat
        self.long = long
 
def locate(latitude: float, longitude: float) -> Point:
    """맵에서 좌표에 해당하는 객체를 검색"""
    ...
    return Point(latitude, longitude)
cs

 

위의 예시에서 latitudelongitude는 float 타입의 변수입니다. 이것을 통해 함수 사용자는 예상되는 타입을 알 수 있습니다. 하지만 파이썬에서는 타입을 검사하거나 강제하지는 않습니다.

또한 함수 반환 값에 대한 예상 타이블 지정할 수 있습니다. 위 예제에서 Point는 사용자 정의 클래스이므로 반환되는 값이 Point의 인스턴스라는 것을 의미합니다.

그러나 어노테이션으로 타입만 지정할 수 있는 것은 아닙니다. 파이썬 인터프리터에서 유효한 어떤 것도 사용할 수 있습니다. 예를 들어 변수의 의도를 설명하는 문자열, 콜백이나 유효성 검사 함수로 사용할 수 있는 callable 등이 있씁니다.

어노테이션을 사용하면 __anotations__ 라는 특수한 속성이 생깁니다. 이 어노테이션의 이름과 값을 매핑한 dict 타입의 값입니다. 이 정보를 사용하여 문서 생성, 유혀성 검증 또는 타입 체크를 할 수 있습니다.

1
2
>>> locate.__annotations__
{'latitude'<class 'float'>'longitude'<class 'float'>'return'<class 'some_code.Point'>}
cs

 

PEP-484를 적용하면 어노테이션을 통해 코드를 확인할 수 있습니다. 이 PEP는 타입 힌팅의 기본 원리를 정의한 것으로 어노테이션을 통해 함수 타입을 체크할 수 있습니다.

https://peps.python.org/pep-0484/

 

PEP 484 – Type Hints | peps.python.org

PEP 484 – Type Hints PEP 484 Title Type Hints Author Guido van Rossum , Jukka Lehtosalo , Łukasz Langa BDFL-Delegate Mark Shannon Discussions-To python-dev@python.org Status Final Type Standards Track Created 29-Sep-2014 Python-Version 3.5 Post-History

peps.python.org

파이썬 3.6버전 부터 어노테이션과 관련한 한 가지 추가 개선사항이 있습니다. 함수 파라미터와 리턴 타입뿐만 아니라 변수에 직접 주석을 달 수 있게 되었는데, 이것은 PEP-526에 소개되었으며, 다음과 같이 값을 지정하지 않은 채로 변수의 타입을 선언할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
class Point:
    lat: float
    long: float
 
    def __init__(self, lat, long):
        self.lat = lat
        self.long = long
 
>>> Point.__annotations__
{'lat'<class 'float'>'long'<class 'float'>}
cs

저는 파이썬으로 여러 프로젝트를 진행하며 함수 반환 값이 어떤 타입의 변수인지 알기 힘들어 일일이 출력해보며 확인했던 경험이 있습니다. 이 때 어노테이션이 적용되어있더라면 좀 더 편했을 것이라 생각합니다.

PEP-484에는 다음과 같은 내용도 있습니다.

파이썬은 여전히 동적인 타입의 언어로 남을 것이다. 타입 힌트를 필수로 하자거나 심지어 관습으로 하자는 것은 전혀 아니다.

 

어노테이션이 Python에서 필수적인 요소로 적용되지는 않는다는 말입니다. 하지만 '좋은 코드' 혹은 '이해가 잘 되는 코드'를 작성하기 위해서는 좋은 속성이라는 생각이 듭니다.

참고자료