본문 바로가기
파이썬/코딩 스타일 & 개념

파이썬 type hints

by David.Ho 2023. 1. 16.
728x90
반응형

파이썬은 동적으로 입력되는(dynamically typed)언어입니다.

 

그래서 다음과 같은 코드도 동작이 됩니다.

name = '딥러닝 마스터'
name = 26
name = True

'name'변수는

1. 'string(문자열)'로 시작하여

2. 'number(숫자)'가 되고

3. 마지막엔 boolean이 됩니다.

이러한 코드는 동작이 될지는 몰라도 유저 장치에서 실행되는 도중에 발생하는 수많은 런타임 에러의 원이이 되기도 합니다.

 

def add(a, b, c):
	return a + b + c
    
    
add(1, 2, 3)
=> 6

 

'a', 'b', 'c'를 취하고 'a+b+c'를 리턴하는 함수가 있습니다.

사람은 그 함수를 숫자로만 불러야 한다는 것을 알지만 파이썬은 그 사실을 알지 못합니다!!!

파이썬은 a, b, c의 타입이 무엇이어야 하는지 알지 못합니다. 그 때문에 무엇이든 통과할 수 있게 되어 문제가 발생합니다.

add(1, "2", 3)

그래서 누군가 위와같은 작은 실수를 하여 문자열 내부에 숫자 2를 전송하면 파이썬은 여전히 해당 코드를 실행하려고 시도할 것이고 '정수' 그리고 '문자열' 사이에 '+'를 사용할 수 없다는 오류로 끝날 것입니다.

 

이러한 일에 대해서 힌트나 경고를 파이썬 3.5버전부터 지원되는 type hints를 통해 얻을 수 있습니다.

apples = 30

apples: int = 30

위와 같이 ':'와 파이썬 유형을 이용하여 type hint를 추가할 수 있습니다.

 

그리고 'mypy'와 같은 type checker(유형 검사기)를 사용하여 검사가 가능합니다.

https://davidho.tistory.com/entry/Mypy%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%ED%83%80%EC%9E%85-%ED%9E%8C%ED%8C%85

 

Mypy를 사용한 타입 힌팅

Mypy는 파이썬에서 가장 일반적으로 사용하는 정적 타입 검사 도구입니다. mypy를 설치하면 프로젝트의 모든 파일을 분석하여 타입 불일치를 검사해줍니다. 버그를 조기에 발견할 수 있기 때문에

davidho.tistory.com

 

위와 같이 콘솔로 작동하는 것이 싫고 vs코드를 사용중이라면

VSCode 하단 바로 이동하여

'Type Checking'을 'On'으로 전환하면 됩니다!

(그러면 vs코드가 경고 표시를 할 것입니다.)

 

# 정수만 허용하도록 수정
def add(a: int, b: int, c: int):
	return a + b + c

# 함수 반환 유형도 지정가능
def add(a: int, b: int, c: int) -> int:
	return a + b + c

# list

str_type: list[str] = ['a', 'b', 'c']

str_type.append(1) <- 에러 밑줄

# dict

test: dict[str, float] = {
	"a": 9.99,
    "b": 12.98,
    "c": 15.57,
}

menu["d"] = "10" <- 에러 밑줄 so, no float

# 함수 파라미터

from typing import Optional

def say_hello(name: Optional[str] = None):
	return f"Hello ${name}!" if name else "Hello anon!"
    
say_hello() -> o
say_hello("sh") -> o
say_hello(123) -> x

# 숫자와 문자열 모두 포함하는 리스트

from typing import Union

prices: list[Union[str, int]] = [
	1,
    "2",
    3,
    "4",
    5,
]

# 변수를 수정하지 않으려는 경우

from typing import Final

PRICE_PER_PERSON: Final = 999
PRICE_PER_PERSON = 1 <- 에러경고!

https://docs.python.org/ko/3/library/typing.html

 

typing — Support for type hints

Source code: Lib/typing.py This module provides runtime support for type hints. The most fundamental support consists of the types Any, Union, Callable, TypeVar, and Generic. For a full specificati...

docs.python.org

https://mypy.readthedocs.io/en/stable/

728x90
반응형

댓글