Python

GreenBeanΒ·2022λ…„ 3μ›” 14일
0
post-thumbnail

Python

Type Annotationμ΄λž€?

  • 동적(dynamic) ν”„λ‘œκ·Έλž˜λ° 언어인 νŒŒμ΄μ¬μ—μ„œλŠ” 인터프리터(interpreter)κ°€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄μ„œ νƒ€μž…(type)을 μΆ”λ‘ ν•˜μ—¬ 체크
    • λ˜ν•œ νŒŒμ΄μ¬μ—μ„œ λ³€μˆ˜μ˜ νƒ€μž…(type)은 κ³ μ •λ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— κ°œλ°œμžκ°€ μ›ν•˜λ©΄ 자유둭게 λ°”κΏ€ 수 있음

Tip!

  • ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 도쀑에 λ³€μˆ˜μ˜ νƒ€μž…μ΄ λ™μ μœΌλ‘œ λ³€κ²½ λ˜λŠ” νŒŒμ΄μ¬μ€ 동적(dynamic) ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄
  • ν•œλ²ˆ λ³€μˆ˜μ— νƒ€μž…μ„ μ§€μ •ν•˜λ©΄ μ§€μ •ν•œ νƒ€μž…μ™Έμ— λ‹€λ₯Έ νƒ€μž…μ€ μ‚¬μš©ν•  수 μ—†λŠ” μžλ°”λŠ” 정적(static) ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄
  • νƒ€μž…μ— λŒ€ν•œ 파이썬의 μœ μ—°ν•¨μ€ μΌνšŒμ„± μŠ€ν¬λ¦½νŠΈλ‚˜ μ†Œκ·œλͺ¨μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΉ λ₯΄κ²Œ κ°œλ°œν•  λ•ŒλŠ” 큰 μž₯점으둜 μž‘μš©
    • ν•˜μ§€λ§Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 규λͺ¨κ°€ μ»€μ§€κ²Œ 되면 μ΄λŸ¬ν•œ 파이썬의 λ‹€μ΄λ‚˜λ―Ήν•¨μ΄ 치λͺ…적인 λ²„κ·Έλ‘œ μ΄μ–΄μ§ˆ ν™•λ₯ μ΄ λ†’μ•„μ§€κ²Œ 되며 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•ˆμ •μ„±μ— μœ„ν—˜ μš”μ†Œκ°€ λ˜κΈ°λ„ 함
    • λ”°λΌμ„œ μ€‘κ·œλͺ¨ μ΄μƒμ˜ 파이썬 ν”„λ‘œμ νŠΈμ—μ„œλŠ” μ†Œμœ„ νƒ€μž… νžŒνŒ…(type hinting)μ΄λΌλŠ” 개발 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ„μž…ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ 많음
  • νƒ€μž… νžŒνŒ…(type hinting)은 말 κ·ΈλŒ€λ‘œ 파이썬 μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ νƒ€μž…μ— λŒ€ν•œ 메타 정보λ₯Ό μ œκ³΅ν•˜λŠ” 것
    • νŒŒμ΄μ¬μ— νƒ€μž… νžŒνŒ…μ΄ μΆ”κ°€λ˜κΈ° μ „μ—λŠ” νƒ€μž…μ„ ν‘œμ‹œν•˜λ €λ©΄ 주석(comments)을 μ΄μš©ν–ˆμ–΄μ•Ό ν–ˆμ—ˆμœΌλ‚˜ 이 방법은 μ½”λ“œλ₯Ό μ½λŠ” κ°œλ°œμžμ—κ²ŒλŠ” μ•½κ°„μ˜ 도움이 λ μ§€λŠ” λͺ¨λ₯΄κ² μœΌλ‚˜ 정해진 ν‘œμ€€μ΄ μ—†μ—ˆκ³  일반 주석과 ꡬ뢄이 μ–΄λ €μ› μŒ
    • λ°˜λ©΄μ— νƒ€μž… νžŒνŒ…μ—μ„œλŠ” νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜(annotation)μ΄λΌλŠ” μƒˆλ‘œμš΄ λ°©λ²•μœΌλ‘œ 파이썬 μ½”λ“œμ˜ νƒ€μž… ν‘œμ‹œλ₯Ό ν‘œμ€€ν™”
      • λ”°λΌμ„œ μ½”λ“œ νŽΈμ§‘κΈ°(IDE)λ‚˜ λ¦°ν„°(linter)μ—μ„œλ„ 해석할 수 μžˆλ„λ‘ κ³ μ•ˆλ˜μ—ˆμœΌλ©° μ½”λ“œ μžλ™ μ™„μ„±μ΄λ‚˜ 정적 νƒ€μž… 체킹에도 ν™œμš©λ˜κ³  있음
      • μ—¬κΈ°μ„œ 주의 사항은 νƒ€μž… νžŒνŒ…μ€ μ–Έμ–΄ λ ˆλ²¨μ—μ„œ μ‹€μ§ˆμ μœΌλ‘œ μ–΄λ– ν•œ μ œμ•½ 사항도 κ°•μš”λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμœΌλ‘œ λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ— μΆ”κ°€ν•œ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ€μ •ν™•ν•œλ‹€κ³  ν•΄μ„œ κ²½κ³ λ‚˜ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 것은 μ•„λ‹˜
        • νƒ€μž… νžŒνŒ…(type hinting)은 μš°λ¦¬κ°€ μž‘μ„±ν•œ μ½”λ“œλ₯Ό λ‹€λ₯Έ κ°œλ°œμžκ°€ 읽기 μˆ˜μ›”ν•˜κ²Œ ν•΄μ£Όκ³ , μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ” 개발 도ꡬ가 ν™œμš©ν•  수 μžˆλ„λ‘ 도와쀄 뿐

λ³€μˆ˜ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜

  • λ³€μˆ˜μ— νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•˜λŠ” 방법
    • λ³€μˆ˜ 이름 뒀에 콜둠(:)을 뢙이고 νƒ€μž…μ„ λͺ…μ‹œν•΄μ£Όλ©΄ 됨
name: str = "John Doe"

age: int = 25

emails: list: ["john1@doe.com", "john2@doe.com"]

address: dict = {
  "street": "54560 Daugherty Brooks Suite 581",
  "city": "Stokesmouth",
  "state": "NM",
  "zip": "80556"
}

ν•¨μˆ˜ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜

def ν•¨μˆ˜λͺ…(<ν•„μˆ˜ 인자>: <인자 νƒ€μž…>, <선택 인자>: <인자 νƒ€μž…> = <κΈ°λ³Έκ°’>) -> <λ°˜ν™˜ νƒ€μž…>:
    ...
  • ν•¨μˆ˜μ— νƒ€μž… νžŒνƒ•μ„ μ μš©ν•  λ•ŒλŠ” 인자 νƒ€μž…κ³Ό λ°˜ν™˜ νƒ€μž…, μ΄λ ‡κ²Œ 두 곳에 좔가해쀄 수 있음
    • μΈμžμ— νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•  λ•ŒλŠ” λ³€μˆ˜μ™€ λ™μΌν•œ 문법을 μ‚¬μš©ν•˜λ©°, λ°˜ν™˜κ°’μ— λŒ€ν•œ νƒ€μž…μ„ μΆ”κ°€ν•  λ•ŒλŠ” ν™”μ‚΄ν‘œ(->)λ₯Ό μ‚¬μš©
def stringify(num: int) -> str:
    return str(num)

def plus(num1: int, num2: float = 3.5) -> float:
    return num1 + num2

def greet(name: str) -> None:
    return "Hi! " + str

def repeat(message: str, times: int = 2) -> list:
    return [message] * times
  • 참고둜 콜둠(:)κ³Ό ν™”μ‚΄ν‘œ(->)λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” 파이썬의 관행을 따라 μ½œλ‘ μ€ λ’€μ—λ§Œ ν•œ 칸을 λ›°μš°κ³ , ν™”μ‚΄ν‘œλŠ” μ•žλ’€λ‘œ ν•œ 칸을 띄움

Tip! 파이썬: νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜

  • μ–΄λ…Έν…Œμ΄μ…˜ νƒ€μž…μœΌλ‘œ μ •μˆ˜λŠ” int, λ¬Έμžμ—΄μ€ str, λ¦¬μŠ€νŠΈλŠ” list, νŠœν”Œμ€ tuple, λ”•μ…”λ„ˆλ¦¬λŠ” dict, 집합은 set, λΆˆμ€ bool을 μ‚¬μš©

typing λͺ¨λ“ˆ

  • λ‚΄μž₯ νƒ€μž…μ„ μ΄μš©ν•΄μ„œ μ’€ 더 λ³΅μž‘ν•œ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•  λ•ŒλŠ” μŠ€νƒ λ‹€λ“œ 라이브러리의 typing λͺ¨λ“ˆμ„ μ‚¬μš©ν•  수 있음
from typing import List, Set, Dict, Tuple


nums: List[int] = [1]

unique_nums: Set[int] = {6, 7}

vision: Dict[str, float] = {'left': 1.0, 'right': 0.9}

john: Tuple[int, str, List[float]] = (25, "John Doe", [1.0, 0.9])

μ‚¬μš©μž μ •μ˜ νƒ€μž… νžŒνŒ…

  • λ‚΄μž₯ νƒ€μž… 뿐만 μ•„λ‹ˆλΌ μ‚¬μš©μž ν΄λž˜μŠ€μ— λŒ€ν•œ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜λ„ λ™μΌν•œ λ°©λ²•μœΌλ‘œ μΆ”κ°€ν•  수 있음
class User:
    ...

def find_user(id: str) -> User:
    ...

def create_user(user: User) -> User:
    ...

νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜ 검사

  • μž‘μ„±ν•œ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ„ κ²€μ‚¬ν•˜κ³  싢을 λ•ŒλŠ” __annotations__ λ‚΄μž₯ 사전 객체λ₯Ό μ‚¬μš©ν•˜λ©΄ 됨
>>> __annotations__
{'no': <class 'int'>, 'name': <class 'str'>, 'age': <class 'int'>, 'address': <class 'dict'>}

>>> repeat.__annotations__
{'message': <class 'str'>, 'times': <class 'int'>, 'return': <class 'list'>}
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 λŒ“κΈ€