Python-type-annotation.md


ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—λŠ” λ‹€μ–‘ν•œ μžλ£Œν˜•μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μžλ£Œν˜•λ“€μ€ ν•˜λ‚˜μ”© λ³€μˆ˜μ— λ§€ν•‘λ˜μ–΄μ§‘λ‹ˆλ‹€. 그런데 μ˜ˆμƒμΉ˜ λͺ»ν•œ μžλ£Œν˜•μœΌλ‘œ 데이터가 λ“€μ–΄μ˜¨λ‹€λ©΄ μ΄λŠ” 였λ₯˜λ₯Ό μœ λ°œν•©λ‹ˆλ‹€. λ˜ν•œ ν”„λ‘œκ·Έλž˜λ° ν• λ•Œ λ³€μˆ˜μ˜ νƒ€μž…μ„ λͺ…μ‹œν•œλ‹€λ©΄ μ’€ 더 ꡬ쑰적으둜 섀계 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄(typescript, kotlin, python λ“±)μ—μ„œ Annotationλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.

μ˜€λŠ˜μ€ Pythonμ—μ„œ μ§€μ›ν•˜λŠ” typehint에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

  • Type Annotationκ³Ό typing νŒ¨ν‚€μ§€ λͺ¨λ‘ μ–΄λ–€ νƒ€μž…μΈμ§€ μ½”λ“œμƒμ—μ„œ λͺ…μ‹œν•˜κ³  에디터 λ ˆλ²¨μ—μ„œ κ²½κ³ λ₯Ό λ„μ›Œμ€„ λΏμž…λ‹ˆλ‹€. 이에 λŒ€ν•œ μ˜ˆμ™Έμ²˜λ¦¬λŠ” 직접 κ΅¬ν˜„ν•΄μ•Όν•©λ‹ˆλ‹€.

Type Anotation

def add(x: int, y: int) -> int:
    return x + y

μœ„μ˜ μ½”λ“œμ™€ 같이 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°μ™€ λ°˜ν™˜κ°’μ˜ νƒ€μž…μ„ 지정해쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ μœ„μ˜ ν•¨μˆ˜μ—

print(add("he", "llo"))

μ΄λ ‡κ²Œ μ§€μ •ν•œ νƒ€μž…κ³Ό λ‹€λ₯Έ νƒ€μž…μ˜ 데이터λ₯Ό νŒŒλΌλ―Έν„°λ‘œ μ „μ†‘ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? img1

두 λ¬Έμžμ—΄λ‘œ μ—°κ²°λ˜μ–΄ 잘 좜λ ₯λ˜λ²„λ¦½λ‹ˆλ‹€. ν•˜μ§€λ§Œ Pycharmκ³Ό 같은 μ—λ””ν„°μ—μ„œλŠ” img2 μ΄λ ‡κ²Œ ν‘œμ‹œλ©λ‹ˆλ‹€.

μ΄λŠ” Python Type Annotation은 단지 μ½”λ“œμƒμ—μ„œ λͺ…μ‹œν•˜κ³  에디터 λ ˆλ²¨μ—μ„œ κ²½κ³ λ₯Ό λ„μ›Œμ€„ 뿐이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. λ”°λΌμ„œ 이에 λŒ€ν•œ μ˜ˆμ™Έμ²˜λ¦¬λŠ” 직접 κ΅¬ν˜„ν•΄μ•Όν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ mypyλΌλŠ” νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜λ©΄ 이λ₯Ό ν…ŒμŠ€νŠΈ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

pip install mypy

pip둜 κ°„λ‹¨νžˆ μ„€μΉ˜ν•  수 있고

mypy둜 μœ„μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚€λ©΄ img3 νƒ€μž…μ„ μ²΄ν¬ν•˜κ³  λ¬Έμ œκ°€ μžˆλ‹€λ©΄ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. λ‹¨μˆœν•œ ν…ŒμŠ€νŠΈ 이기 λ•Œλ¬Έμ— λ¬Έμ œκ°€ μ—†λ‹€κ³  해도 아무것도 좜λ ₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

typing

λ§Œμ•½ int, str 같이 λ‹¨μˆœν•œ νƒ€μž…μ΄ μ•„λ‹Œ λ³΅μž‘ν•œ νƒ€μž…μ„ μ‚¬μš©ν•œλ‹€λ©΄ typingνŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

ν•΄λ‹Ή νŒ¨ν‚€μ§€λŠ” Pythonμ—μ„œ μ§€μ›ν•˜λŠ” νŒ¨ν‚€μ§€λ‘œ 3.5버전 μ΄ν›„μ˜ νŒŒμ΄μ¬μ—μ„œλŠ” 기본으둜 μ œκ³΅λ©λ‹ˆλ‹€.

λ§Œμ•½ μ •μˆ˜λ§Œ ν¬ν•¨ν•˜λŠ” 리슀트λ₯Ό λ°›λŠ”λ‹€λ©΄

from typing import List

def add(x: List[int]) -> int:
    return sum(x)

print(add([1,2,3]))

List 뿐만 μ•„λ‹ˆλΌ Dict, Tuple λ“±λ“± λ‹€μ–‘ν•œ νƒ€μž…μ„ μ§€μ›ν•©λ‹ˆλ‹€.

Type Aliases

New Type 을 μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ— 별칭을 뢙일 수 μžˆμŠ΅λ‹ˆλ‹€.

from typing import List, NewType

UserId = NewType('UserId', int)
user_id = UserId(123)
print(user_id)
# 좜λ ₯: 123
print(type(user_id))
# 좜λ ₯: <class 'int'>


IdList = NewType('IdList', List[int])
id_list = [1, 2, 3]
print(IdList(id_list))
# 좜λ ₯: [1, 2, 3]
print(type(id_list))
# 좜λ ₯: <class 'list'>

Callable

ν•¨μˆ˜μΈμžμ— λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό λ„˜κ²¨μ€„λ–„λŠ” Callable을 μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

μ‚¬μš© : Callable[[μΈμžνƒ€μž…λ¦¬μŠ€νŠΈ], λ°˜ν™˜ νƒ€μž…]ν˜•μ‹

from typing import Callable


def add(x: int, y: int) -> int:
    return x + y


def subtract(x: int, y: int) -> int:
    return x - y


def call_func(x: int, y: int, func: Callable[[int, int], int]) -> int:
    return func(x, y)


call_func(10, 20, add)
call_func(10, 20, subtract)

TypeVar, Union, Optional

TypeVarλ₯Ό μ‚¬μš©ν•˜λ©΄ μ œλ„€λ¦­ νƒ€μž…μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class TypeVar(_Final, _Immutable, _root=True):
    Usage::

      T = TypeVar('T')  # Can be anything
      A = TypeVar('A', str, bytes)  # Must be str or bytes
    def __init__(self, name, *constraints, bound=None,
                 covariant=False, contravariant=False):

μœ„λŠ” typing νŒ¨ν‚€μ§€μ˜ TypeVar λͺ¨λ“ˆμ˜ λ‚΄μš© 쀑 일뢀 μž…λ‹ˆλ‹€. μ—¬λŸ¬ μžλ£Œν˜• 쀑 ν•˜λ‚˜λ₯Ό λ°›μ•„μ•Ό ν•  λ–„λŠ” TypeVar에 μ—¬λŸ¬ νƒ€μž…μ„ μ „λ‹¬ν•˜κ±°λ‚˜ Union,Optional을 μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€. μ΄λ•Œ ν•„μˆ˜μ μΈ μΈμžκ°€ μ•„λ‹ˆλΌλ©΄ Optional을 μ‚¬μš©ν•©λ‹ˆλ‹€.

from typing import TypeVar, Union, Optional


Numeric = TypeVar('Numeric', int, float)
Numeric2 = Union[int, float]
OptionalNumeric = Optional[int, float]

# Optional[T]λŠ” Union[T, None]와 κ°™λ‹€

μ΄λ ‡κ²Œ Pythonμ—μ„œ typehintλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

Last updated