TypeHint
- 파이썬은 인터프리터가 실행하며 타입을 추론하여 체크한다.
- 파이썬은 동적 자료형 언어이다.
- 파이썬의 다이나믹함은 애플리케이션의 안정성에 위험 요소가 될 수 있다.
- 파이썬 코드를 작성할 때 타입에 대한 메타 정보를 제공하는 타입 힌트가 필요하다.
- 타입힌트는 주석 단위일 뿐 타입을 체크해주지는 않는다.(런타임 에러가 나지 않는다.)
typing
- typing은 기본적인 타입 힌트에서 복잡하고 다양한 타입 힌트들을 제공한다.
from typing import List, Tuple, Dict, Any, Iterable
int_var: int = 11
str_var: str = "hello"
float_var: float = 99.9
bool_var: bool = True
list1_var: List[int] = [1, 2, 3]
list2_var: List[Any] = [1, "str", 3]
tuple1_var: Tuple[int, ...] = (1, 2, 3)
tuple2_var: Tuple[int, int] = (1, 2)
tuple3_var: Tuple[()] = ()
dic_var: Dict[str, int] = {"hello": 46}
iter_var: Iterable[int] = [1, 2, 3]
타입힌트 문서
pyright
- 타입 힌트는 주석단위로 도와줄 뿐이지 타입을 체크해주지는 않는다.
- 타입 체크를 해주는 pyright 라이브러리를 사용한다면 체크 후 실행까지 커맨트 명령어로 수행 가능하다.
- 여러 명령어들을 합친다면 앞에서부터 순서대로 실행이 가능하다.(pyright type.py && python type.py)=>type.py의 타입체크를 모두 해주고 유효하다면 파이썬으로 실행
def cal_add(x: int, y: int) -> int:
return x + y
print(cal_add(1, "string"))
pyright type.py
C:\SSAFY\python\type.py
C:경로:26:29 - error: Function with declared return type "User" must return value on all code paths
Type "None" cannot be assigned to type "User" (reportGeneralTypeIssues)
C:경로:41:18 - error: Argument of type "Literal['string']" cannot be assigned to parameter "y" of type "int" in function "cal_add"
"Literal['string']" is incompatible with "int" (reportGeneralTypeIssues)
2 errors, 0 warnings, 0 informations
Class Type
- 직접 정의한 클래스를 타입으로 명시할 수 있다.
class Hello:
def world(self) -> int:
return 7
hello: Hello = Hello()
def foo(ins: Hello) -> int:
return ins.world()
print(foo(hello))
- 정의된 클래스 안에서는 같은 이름의 클래스를 타입으로 선언할 수 없기에 특수한 문자를 사용한다.
from typing import Optional
class Node:
def __init__(self, data: int, node: Optional["Node"]):
self.data = data
self.node = node
node2 = Node(12, None)
node1 = Node(27, node2)
Union Type
- args들로 이루어진 것이다.(None을 명시하지 않으면 받지 않는다.)
from typing import Union
x: Union[int, str] = 17
x = "str"
y: Union[int, Union[str, float]] = 10
y = "str"
y = 10.5
Optional Type
- default값이 None을 갖는다면 Optional을 활용한다.
from typing import Optional
def foo(name: str) -> Optional[str]:
if name == "steve":
return None
else:
return name
result: Optional[str] = foo("steve")
Final Type
- 값의 변경이 이루어지지 않는 자료형(상수형 자료형)
from typing import Final
RATE: Final = 30
RATE = 20
error: "RATE" is declared as Final and cannot be reassigned
1 error, 0 warnings, 0 informations
Type Alias
- 많은 자료형을 담은 자료형은 변수화를 할 수 있다.
from typing import Union, List, Tuple, Dict, Optional
Value = Union[
int, bool, Union[List[str], List[int], Tuple[int, ...]], Optional[Dict[str, float]]
]
value: Value = 17
def cal(v: Value) -> Value:
return v
- 가져야하는 키값과 그 자료형들을 미리 정의할 수 있다.
from typing_extensions import TypedDict
class Point(TypedDict):
x: int
y: float
z: str
point1: Point = {"x": 10, "y": 10.2, "z": "str"}
point2: Point = {"x": 10, "y": 10.2, "w": "str"}
error: Expression of type "dict[str, int | float | str]" cannot be assigned to declared type "Point"
"w" is an undefined field in type "Point" (reportGeneralTypeIssues)