파이썬3는 함수의 매개변수와 반환값에 메타데이터를 추가할 수 있는 구문을 제공합니다.
#애너테이션을 추가한 clip()함수
def clip(text:str, max_len:'int >0'=80) ->str:
"""
max_len 앞이나 뒤의 마지막 공백에서 잘라낸 텍스트를 반환한다.
"""
end = None
if len(text) > max_len:
space_before = text.rfind(' ',0, max_len)
if space_before >= 0:
end = space_before
else:
space_after = text.rfind(' ', max_len)
if space_after >= 0:
end = space_after
if end is None:
end = len(text)
return text[:end].rstrip()
함수 선언에서 각 매개변수에는 콜론 뒤에 애너테이션 표현식을 추가하고, 기본값이 있을 때 애너테이션은 인수명과 등호 사이에 들어갑니다. 그리고, 반환값에 애너테이션을 추가하려면 매개변수를 닫는 괄호와 함수 선언의 제일 뒤에 오는 콜론 사이에 -> 기호와 표현식을 추가한다.
표현식은 어떤 자료형도 될 수 있고, str이나 int와 같은 클래스, 혹은 max_len에 대한 애너테이션인 'int>0'과 같은 문자열이 가장 널리 사용되는 자료형이다. 즉, 애너테이션은 전혀 처리하지 않으며, 단지 함수 객체 안의 dict형 annotation속성에 저장될 뿐이다.
fkrom clip_annot import clip
clip.__annotations__
'return'키에 대한 항목에서 함수 선언부 중 -> 기호로 표시한 반환값 애너테이션을 담고 있고 파이썬은 애너테이션을 함수의 annotations 속성에 저장할 뿐이며, 검사, 단속, 검증등 아무런 행동도 취하지 않는다.
애너테이션은 파이썬 인터프리터에 아무런 의미가 없고, 애너테이션 도구(IDE 등), 프레임워크, 데커레이터가 사용할 수 있는 메타데이터일 뿐이다.
from clip_annot import clip
from inspect import signature
sig = signature(clip)
sig.return_annotation
for param in sig.parameters.values():
note = repr(param.annotation).1just(13)
print(note,':', param.name, '=', param.default)
signature() 함수는 Signature 객체를 반환하는 것으로 Signature에는 return_annotation과 parameters 속성이 있고, parameters는 파라미터명을 Parameter 객체에 매핑하는 딕셔너리로, 각 Parameter 객체는 annotation 속성을 가지고 있습니다.
price:float
쿼리 문자열을 함수가 받는 float형으로 자동 변환한다.
quantity:'int >0'
함수 애너테이션은 Bobo와 같은 동적 설정보단 IDE나 linter와 같은 도구에서 정적 자료형 검사를 지원하기 위한 선택적인 자료형 정보를 제공하는데 큰 영향을 줄 것이다.