About

Python 학습 가이드

문법, 프레임워크, 패키지 — 코드 레벨로 동작 원리 정리

문법 & 기초

Generator와 yield — 메모리를 안 먹는 이터레이션의 원리

yield가 함수 실행을 "일시 정지"시키는 메커니즘

Generator는 값을 한꺼번에 만들지 않고 yield로 하나씩 내보낸다. 10GB 파일을 한 줄씩 처리할 수 있는 이유가 이것이다. 내부적으로 함수의 스택 프레임을 보존하면서 실행을 중단/재개한다.

Decorator 내부 구조 — @가 실제로 하는 일

함수를 받아서 함수를 반환하는 함수 — 그게 전부다

@decorator는 문법적 설탕(syntactic sugar)이다. func = decorator(func)와 동일하다. 클로저와 *args/**kwargs 조합으로 원본 함수를 감싸는 패턴.

Context Manager — with문이 실제로 하는 일

__enter__과 __exit__로 리소스 정리를 보장하는 프로토콜

with open("f") as f: 의 with는 __enter__()를 호출해서 리소스를 얻고, 블록이 끝나면(에러가 나든 안 나든) __exit__()로 정리한다. contextlib.contextmanager로 generator 기반 구현도 가능.

Type Hints — 런타임에서는 아무것도 안 한다

Python의 타입 힌트가 "힌트"인 이유와, Pydantic이 이걸 극복하는 방법

Python의 type hint(: int, -> str)는 런타임에 검사되지 않는다. mypy 같은 정적 분석 도구가 읽을 뿐이다. Pydantic은 이 한계를 __init_subclass__와 모델 검증으로 넘어서서 런타임 타입 검사를 구현한다.

Keyword-only 인자 — `*,` 가 뭔지, 왜 쓰는지

`def f(a, b, *, c)` 의 그 별 하나

Python의 `*,`는 "여기부터는 키워드로만 받는다"는 구분선이다. 위치 인자로 넘기면 TypeError. 호출 의도를 명확하게 하고 시그니처 변경에 강하게 만든다. Ruby에는 `:` 키워드 인자 자체가 처음부터 keyword-only라 별도 문법이 필요 없다.