LeetCode 알고리즘 문제를 vscode에서 풀 때 계속해서 NameError가 발생하여 type annotation에 대해 알아보게 되었습니다.
예외가 발생했습니다. NameError
name 'List' is not defined
# 동적 프로그래밍 언어
파이썬은 동적(Dynamic) 프로그래밍 언어입니다. 따라서 파이썬 인터프리터는 변수의 타입을 추론하여 코드를 실행합니다. 또한 파이썬에서 변수의 타입은 고정돼 있지 않기 때문에 개발자가 원하면 변수의 타입을 자유롭게 바꿀 수 있습니다. 이렇게 파이썬에서는 타입을 유연하게 처리할 수 있기 때문에 다른 언어에 비해 간결한 코드를 작성할 수 있다는 장점이 있습니다.
이러한 파이썬의 유연함은 소규모의 프로젝트를 작성할 때 큰 장점이 됩니다. 하지만 프로젝트의 규모가 커지게 되면 이러한 파이썬의 다이나믹함이 치명적인 버그로 이어질 확률이 큽니다. 따라서 어느 정도의 규모가 있는 프로젝트를 진행할 때에는 소위 타입 힌팅(Type Hinting)이라는 개발 프로세스를 도입하여 사용하는 경우가 많습니다.
# 타입 힌팅(Type Hinting)
타입 힌팅은 파이썬 코드 작성시 변수의 타입에 대한 정보를 알려주는 것입니다. 타입 힌팅이 도입되기 전인 Python 3.5 이전 버전에서는 타입에 대한 정보를 주석으로 처리해야 했습니다. 주석이 있는데 타입 힌팅이 왜 필요해?라고 반문할 수 있습니다. 하지만 타입의 정보를 전달하는 방식의 표준이 없었고, 다른 주석들과 구분이 어렵기 때문에 코드를 이해하는데 더 많은 시간이 소요될 수 있습니다.
따라서 3.5 버전부터 타입 어노테이션(annotation)이라는 방법으로 타입의 표시를 표준화했습니다. 그렇다고 타입 어노테이션을 강요하는 것은 아닙니다. 따라서 변수나 함수에 추가한 타입 어노테이션이 부정확하다고 해서 에러가 발생하지는 않습니다. 타입 어노테이션은 단지 작성한 코드를 좀 더 수월하게 읽게 해 주기 위해 활용하는 것입니다.
# 타입 어노테이션(Type Annotation)
아래 코드에서 'name: str'은 name의 타입에 대한 정보입니다. '-> str'은 함수의 값을 '문자열로 반환할 것'이라는 정보를 나타냅니다.
def greeting(name: str) -> str:
return 'Hello ' + name
원래 타입 어노테이션을 사용할 때에는 typing 모듈에서 제공하는 List, Dict, Tuple, Set를 사용하여 타입 어노테이션을 추가해야 했습니다. 맨 앞에서 언급했던 "name 'List' is not defined" 에러는 List를 import하지 않아서 발생했던 것입니다.
# after Python 3.9
Python 3.9 이전
from typing import List
def getSum(edges: List[List[int]]) -> int:
for i in range(len(edges)):
return [sum(edges[i]) for edges[i] in edges]
print(getSum([[1,2],[2,3],[4,2]]))
Python 3.9 이후
def getSum(edges: list[list[int]]) -> int:
for i in range(len(edges)):
return [sum(edges[i]) for edges[i] in edges]
print(getSum([[1,2],[2,3],[4,2]]))
버전 3.9 이전과 이후의 차이가 보이시나요? 3.9 이전 버전에서는 typing 모듈을 불러와서 타입 어노테이션을 사용할 수 있었습니다. 또한 어노테이션을 대문자로 시작해야 했습니다. 하지만 Python 3.9 이후부터는 더 이상 typing 모듈을 불러오지 않아도 됩니다. 또한 어노테이션도 모두 소문자로 작성합니다. 이로써 타입 어노테이션을 좀 더 편하게 사용할 수 있게 되었습니다.
reference
https://www.daleseo.com/python-typing
https://stackoverflow.com/questions/57505071/nameerror-name-list-is-not-defined/62496306#62496306
https://docs.python.org/3/library/typing.html?highlight=hint
'Language > Python' 카테고리의 다른 글
[Python] Python 버전 확인 방법(명령어) (0) | 2022.09.25 |
---|
댓글