- 프롤로그
- 개발 첫걸음
- 파이썬 기초
- 파이썬 중급
- 파이썬 고급
- 내장 함수 톺아보기
- 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
- 변수의 범위 – 이름 검색의 범위
- 파이썬 심화
- 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
- 데코레이터 – 함수의 기능을 강화하기
- 프로퍼티
- 제너레이터
- async와 await
- 객체로서의 클래스 – 클래스를 동적으로 정의하기
- 파이썬 프로젝트 실습
- 원카드 게임 만들기 (1)
- 원카드 게임 만들기 (2)
- 원카드 게임 만들기 (3) (작성중)
- 턴제 자동 전투 게임 만들기 (작성중)
- 실전 (파이썬 외적인 것들)
- 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
- 유니코드 – 컴퓨터에서 문자를 표기하는 방법
- html, css, 인터넷 – 자동화 첫 걸음 내딛기
- 네트워크 – 인터넷으로 통신하는 방법
- 문서 – 문맥을 읽어보기
어노테이션은 사전적 의미로는 주석입니다. 하지만 우리가 #
으로 작성하는 주석과 혼동될 수 있기 때문에 어노테이션이라고 계속 말하도록 하겠습니다. 그리고 구글에다가 검색해보다 알게 된 사실인데, 자바에서는 어노테이션이 파이썬의 데코레이터(추가 예정)와 대응되는 것 같습니다. 파이썬의 어노테이션은 다소 다른 용도입니다.
어노테이션이 적용된 모습
제가 쓰는 Visual Studio Code를 포함하여 요즘의 텍스트 에디터 및 IDE는 타입을 추정하는 능력이 탁월합니다. 대부분의 상황에서는 파이썬의 어노테이션으로 타입을 명시할 필요가 없지요. 하지만 그 강력한 타입 추정도 잡아내지 못하는 타입이 있기 마련입니다. 아래 예제를 참조해주세요.
에디터 입장에서는 기가 찰 겁니다. 함수의 인수로 뭐가 올지 모르는데 어떻게 그게 Watch
클래스인 걸 알겠습니까? 타입 추정이 제대로 되지 않는다는 게 당연해보입니다. 그럴 때는 함수의 인수에 직접 어노테이션을 적용하면 됩니다. 인수의 이름 뒤에 : 타입
을 작성하면 됩니다.
다른 사람들이 정성스레 만들어놓은 모듈을 끌고 와서 간단한 프로그램을 만든다 하더라도, 이제 100줄 넘기기는 우스우실 것입니다. 직접 클래스를 설계해야 하는 상황에 온다면, 200~300줄도 가볍습니다. 이렇게 길어지는 코드에서, 매번 클래스의 어떤 속성을 무슨 이름으로 짜넣었는지 찾는다고 스크롤을 올리고 내리다 보면, 마우스 휠 밖에 왔다갔다 하지 못하는 스스로를 발견하게 됩니다. 이런 절망적인 상황에서 어노테이션은 한 줄기 빛이자 희망입니다.
기본적인 사용법
사용하는 위치는 크게 세 가지로 나뉩니다. 함수의 인수, 함수의 반환, 변수의 정의 입니다. 아래 코드는 그 모든 것을 표현하는 코드입니다. 변수나 인수의 경우 변수명과 =
사이에 : 타입
을 적어서 표시하고, 함수의 반환값의 경우 함수 블록이 시작하기 직전에 -> 타입
으로 적어서 표시합니다.
def something(num: int = 10) -> Time:
w: Watch = notExistFunction()
return w.time + num
코드에서 무엇이 어떻게 어노테이션되었는가는 아래 표를 참조해주세요.
구분 | 어노테이션 된 타입 | 비고 |
---|---|---|
something 의 인수 num |
int |
기본값이 10이다. |
something 의 리턴 값 |
Time |
– |
지역 변수 w |
Watch |
notExistFunction() 의 결과가 대입되었다. |
컨테이너 사용법
리스트와 딕셔너리 같은 컨테이너의 경우 조금 난감합니다. 왜냐하면 해당 변수(인수)가 리스트인 것 까지는 어노테이션으로 쉽게 할 수 있으나, 그 안에 있는 요소가 무슨 타입인지는 지정할 수 없기 때문입니다. 아래 예제에서 가장 하단에 watchList.pop()
까지는 타입 추정이 잘 작동하지만, 이 리스트 안에 어떤 요소가 있는지는 추정할 수 없으므로 getTime()
은 직접 쳐서 넣어야 합니다.
class Watch:
def __init__(self, time, color):
self.time = time
self.color = color
def getTime(self):
return self.time
def handleWatchList(watchList: list):
watchList.pop().getTime()
하지만 이를 극적으로 바꿀 수 있습니다. 아래 예제대로 한다면 리스트 내부에 있는 요소까지 에디터에서 다룰 수 있게 됩니다.
from typing import List
class Watch:
def __init__(self, time, color):
self.time = time
self.color = color
def getTime(self):
return self.time
def handleWatchList(watchList: List[Watch]):
watchList.pop().getTime()
우선 typing
모듈에서 List
를 임포트합니다. 이 List
클래스는 어노테이션만을 위한 클래스입니다. 이 List
에 대괄호를 이용해 내부에 있는 요소의 타입까지 지정할 수 있습니다. 예를 들어 list
에 Watch
객체가 들어간다면 List[Watch]
로 지정하면 됩니다.
딕셔너리도 다소 비슷한데요, 딕셔너리는 Dict
와 대괄호를 이용하며, 대괄호 안에 키의 타입과 값의 타입을 각각 설정할 수 있습니다.
from typing import Dict
class Watch:
def __init__(self, time, color):
self.time = time
self.color = color
def getTime(self):
return self.time
def handleWatchList(watchDict: Dict[str, Watch]):
watchDict.popitem()[1].getTime()
고급 – 클래스 속성과 일반 속성
클래스 속성과 일반 속성은 공식 문서를 참조하도록 하겠습니다.
from typing import ClassVar, Dict
class BasicStarship:
captain: str = 'Picard' # 기본값이 있는 일반 속성
damage: int # 기본값이 없는 일반 속성
stats: ClassVar[Dict[str, int]] = {} # 클래스 속성
고급 – 함수
함수, 즉 호출할 수 있는 객체를 나타내고 싶을 때도 있을텐데요, 그럴 때는 Callable
를 이용하면 됩니다. Callable
의 사용법은 Callable[[인수1타입, 인수2타입, ...], 리턴타입]
으로 하면 됩니다. 아래는 간단한 예제입니다.
def executeCallback(num:int, callback:Callable[[int, int], str]):
p = callback(num, 10)
p.lower()
인수나 리턴에 아무것도 넣고 싶지 않다면 None
을 활용하면 됩니다.
def executeCallback(num:int, callback:Callable[[None], None]):
callback()
유의사항
어노테이션을 적용했다고 해서 해당 타입을 강제로 사용해야 하는 것은 아닙니다. 오히려 실제 프로그램이 실행될 때에는 어노테이션은 정말로 아무런 역할을 하지 않습니다! 오로지 어노테이션은 에디터로 작업할 때 유용하기 위해 지정하는 것임을 유념해주세요. 아래처럼 해도 실행에는 아무런 지장이 없습니다.
def add(num: str) -> str:
return 10 + num
print(add(20))
30
레퍼런스
- 프롤로그
- 개발 첫걸음
- 파이썬 기초
- 파이썬 중급
- 파이썬 고급
- 내장 함수 톺아보기
- 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
- 변수의 범위 – 이름 검색의 범위
- 파이썬 심화
- 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
- 데코레이터 – 함수의 기능을 강화하기
- 프로퍼티
- 제너레이터
- async와 await
- 객체로서의 클래스 – 클래스를 동적으로 정의하기
- 파이썬 프로젝트 실습
- 원카드 게임 만들기 (1)
- 원카드 게임 만들기 (2)
- 원카드 게임 만들기 (3) (작성중)
- 턴제 자동 전투 게임 만들기 (작성중)
- 실전 (파이썬 외적인 것들)
- 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
- 유니코드 – 컴퓨터에서 문자를 표기하는 방법
- html, css, 인터넷 – 자동화 첫 걸음 내딛기
- 네트워크 – 인터넷으로 통신하는 방법
- 문서 – 문맥을 읽어보기
잘 읽고 갑니다. 공식 문서에 있는 내용을 번역해서 쉽게 풀어 설명해주시니 접근성이 높아지네요. 자주 참고할 것 같습니다.