고급 Python 기능들

2 weeks ago 11

  • 파이썬에서 흔히 알려지지 않은 고급 기능 14가지를 실제 예제와 함께 소개함
  • typing, generics, protocols, context managers 등 정적 타이핑과 구조적 설계에 대한 심도 있는 설명 제공
  • 파이썬 3.10 이상부터 새롭게 도입된 구조적 패턴 매칭슬롯, 메타클래스 등 성능 최적화 기법도 포함
  • f-string, cache, future, proxy, for-else, walrus 등 깔끔한 코드 작성을 위한 팁 수록
  • 각 기능마다 추가 학습을 위한 링크와 참고 자료 제공, 주니어 개발자도 쉽게 접근 가능한 구성

파이썬 고급 기능 14가지 요약

# 타이핑 오버로드

  • @overload 데코레이터는 하나의 함수에 여러 타입 시그니처를 정의 가능하게 함
  • 타입 체커는 전달된 인자 값에 따라 리턴 타입을 정확히 추론할 수 있음
  • Literal을 활용해 문자열 값 제한도 가능
  • id 또는 username 중 하나만 필수로 받는 함수 시그니처도 구현 가능
  • 타입 안정성을 위한 경량화된 Enum 대체로 Literal 활용

# 키워드 전용/위치 전용 인자

  • *를 사용하면 키워드 전용 인자로 설정 가능 (위치 인자 사용 불가)
  • /를 사용하면 위치 전용 인자로 설정 가능 (키워드 인자 사용 불가)
  • API 설계 시 인자 사용 방식을 명확히 강제할 수 있음

# 미래 어노테이션 (__future__)

  • 타입 힌트는 원래 런타임에서 바로 평가되기 때문에 선언 순서 이슈 발생
  • from __future__ import annotations로 평가 시점 지연 가능
  • 하지만 문자열 처리 방식이므로 런타임에서 타입 사용 시 주의 필요
  • PEP 649는 __annotations__ 속성에 지연 평가 방식으로 개선 제안

# 제네릭(Generic) 문법

  • 파이썬 3.12부터는 새로운 제네릭 타입 정의 문법 지원
  • TypeVar 대신 class Foo[T, U: int] 형태로 더 직관적 사용 가능
  • 가변 길이 제네릭(Variadic Generics) 도 도입되어 다양한 타입 처리 가능
  • 타입 별칭 정의도 간결해져 type Vector = list[float] 형태로 사용 가능

# 프로토콜(Protocols)

  • Duck Typing의 타입 체크 버전으로 구조적 서브타이핑 구현 가능
  • 클래스가 특정 메서드를 갖고 있다면 타입 상속 없이도 타입 호환 가능
  • @runtime_checkable로 isinstance 검사도 가능하게 확장 가능

# 컨텍스트 매니저(Context Manager)

  • __enter__, __exit__ 메서드를 가진 객체로 with 블록에서 사용
  • contextlib.contextmanager 데코레이터로 간단한 함수 기반 구현 가능
  • yield를 기준으로 전후로 설정 및 정리 작업 수행

# 구조적 패턴 매칭

  • match-case 문법으로 복잡한 데이터 구조를 직관적으로 분기 처리
  • 튜플/리스트 구조 분해, OR 패턴, 가드 조건(if), 와일드카드 사용 가능
  • 데이터의 구조를 기준으로 분기 가능하므로 가독성과 유지보수성 향상

# slots 최적화

  • __dict__ 대신 고정된 슬롯 사용으로 메모리 및 속도 최적화
  • __slots__는 속성 이름만 명시된 튜플을 사용
  • 클래스에 불필요한 속성 추가 방지
  • 하지만 마이크로 최적화 수준으로 사용에 신중함 필요

# 파이썬 코드 스타일 팁 모음

  • for-else 구문: 루프가 break 없이 끝날 경우 else 실행
  • 워루스 연산자(:=): 변수 선언과 검사 동시에 가능
  • or 단축 평가: 여러 값 중 가장 먼저 참인 값을 반환
  • 비교 연산자 체이닝: 0 < x < 10 식으로 코드 간결화 가능

# f-string 고급 포맷팅

  • f"{변수=}" 구문으로 디버깅용 표현 가능
  • 숫자 포맷(:.2f, :+.2f, :,), 날짜 포맷(%Y-%m-%d) 등 다양한 옵션
  • 가운데 정렬, 패딩, 백분율 표현 등 포맷 미니 언어 활용

# 캐시 데코레이터

  • @lru_cache와 @cache로 함수 결과를 저장해 속도 향상
  • 재귀 함수나 반복 계산이 많은 경우 유용
  • @cache는 파이썬 3.9부터 도입, 기본 무제한 캐시 제공

# 파이썬 퓨처(Future)

  • JS의 Promise와 유사한 비동기 객체 처리 기능
  • Future.set_result(), add_done_callback() 등으로 결과 비동기 관리
  • asyncio.Future()는 await과 함께 사용 가능
  • ThreadPoolExecutor와 함께 사용 시 백그라운드 병렬 처리도 가능

# 프록시 속성 (Proxy Property)

  • 하나의 클래스 속성이 속성처럼도, 함수처럼도 동작하게 함
  • __get__, __call__, __repr__를 통해 두 가지 기능 제공
  • API 디자인 시 기본값과 파라미터 호출을 하나의 방식으로 처리 가능
  • 실사용보다는 실험적 예제로 참고할 가치 있음

# 메타클래스

  • 클래스 자체를 생성하는 클래스의 클래스
  • 클래스 속성을 조작하거나 자동 등록 등의 메타 로직 가능
  • 현실적으로는 대부분 데코레이터로 대체 가능
  • Django, SQLAlchemy, Pydantic 등에서는 내부적으로 메타클래스 활용

Read Entire Article