TypeHint

codakcodak·2023년 10월 12일
0

OOP python

목록 보기
12/19
post-thumbnail
post-custom-banner

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]  # str로 이루어진 리스트
list2_var: List[Any] = [1, "str", 3]  # 여러 자료형으로 이루어진 리스트(tuple[int,str,int]로 대체 할수 있다.)

tuple1_var: Tuple[int, ...] = (1, 2, 3)  # 길이가 정해지지 않은 int로 이루어진 튜플
tuple2_var: Tuple[int, int] = (1, 2)  # 길이가 2인 int들로 이루어진 튜플
tuple3_var: Tuple[()] = ()  # 빈 튜플

dic_var: Dict[str, int] = {"hello": 46}  # 문자열을 키로,값을 정수형으로 받는 사전

iter_var: Iterable[int] = [1, 2, 3]  # int로 이루어진 interable한 object

타입힌트 문서

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 #==Union[int,str, float]
y = "str"
y = 10.5

Optional Type

  • default값이 None을 갖는다면 Optional을 활용한다.
from typing import Optional


def foo(name: str) -> Optional[str]:#==Union[str,None]
    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,y,z만을 가져야 하고 각각에 맞는 자료형이어야 한다.
    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)
profile
숲을 보는 코더
post-custom-banner

0개의 댓글