파이썬은 기본적으로 duck-type기반으로 동작하기 때문에 실제 사용시에 에러가 발생해야 디버깅이 가능합니다. 이게 개발속도면에서는 큰 장점이기도 하지만, 큰 프로젝트를 할 때는 양날의 칼이 되기도 합니다
에러가 어디 숨어있는지를 모르고 실제로 실행시켜 봐야 지 알 수 있기 때문입니다.
이글에서 소개하는 함수주석(Functiona Annotation)의 경우에는 각 인자와 return형태를 지정할 수 있게 함으로써 그나마 실행전에 체크하는 것을 거르는 목적이 있습니다. 이 기능은 IDE에서도 지원이 가능하기에 적극 활용할 필요 있어 보입니다.
사용법은 아래와 같이 입력과 출력 등에 표기합니다 다만 이 annotation은 기능상에서 효력은 없습니다. 일단 작성하는 사용자들이 이해하기 쉬운 주석정도라고 보는 것이 맞을 것입니다.
def func1(arg1: str, arg2: 1+2, arg3: 'this is Func annotation') -> str:
print (arg1, arg2, arg3)
return "hello"
def func2(arg1: str, arg2: int, arg3: str) -> int:
print (arg1, arg2, arg3)
return 3
print (func1("aaa",4,"noa"))
print (func2("bbb",6,"test"))
print (func1.__annotations__)
print (func2.__annotations__)
# 실행결과
# aaa 4 noa
# hello
# bbb 6 test
# 3
# {'arg1': <class 'str'>, 'arg2': 3, 'arg3': 'this is Func annotation', 'return': <class 'str'>}
# {'arg1': <class 'str'>, 'arg2': <class 'int'>, 'arg3': <class 'str'>, 'return': <class 'int'>}
파이썬에서 함수를 구현할 때, input과 output의 type을 주석으로서 명시해줄 수 있습니다 이 주석은 동작에 영향을 끼치지 않습니다. 단지 힌트만 제공할 뿐이고, IDE등에서 함수의 in/out이 잘못되었는지 확인하는 정도로 사용할 수 있습니다.
다음과 같이 “:” 과 “->” 를 표기하고 타입을 명시해줍니다. “:”은 함수의 인자에 표기하고, “->”은 리턴 값에 (주석)annotation을 표기합니다.
print (func1.__annotations__)
print (func2.__annotations__)
# {'arg1': <class 'str'>, 'arg2': 3, 'arg3': 'this is Func annotation', 'return': <class 'str'>}
# {'arg1': <class 'str'>, 'arg2': <class 'int'>, 'arg3': <class 'str'>, 'return': <class 'int'>}
위의 예제처럼 annotation은 꼭 type형태의 값이 아니더라도 입력이 가능하고, annotations 함수로 이를 확인해 볼 수 있습니다. 위 결과처럼 임의의 식이든 str을 넣어도 잘 동작합니다.
지금은 아마도 강제하지 않지만, 향후 이를 지원하는 옵션을 추가하든지 해서 컴파일시에 에러를 내는 형태로 지원이 가능하리라 생각됩니다.
댓글 없음:
댓글 쓰기