51P by GN⁺ 2달전 | ★ favorite | 댓글 5개
  • 파이썬에서 흔히 알려지지 않은 고급 기능 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_checkableisinstance 검사도 가능하게 확장 가능

# 컨텍스트 매니저(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 등에서는 내부적으로 메타클래스 활용

백엔드 관점에서 메타클래스는 디버깅을 어렵게 하는 경험이 있었습니다.

Hacker News 의견
  • 안녕하세요! 블로그의 원작자입니다! 새벽 4시에 제 글이 HN의 첫 페이지에 올라온 것을 보고 놀랐음

    • 이 글은 블로그 시작하기 한 달 전에 쓴 14개의 작은 트윗에서 시작되었음
    • 블로그를 시작하면서 이 트윗들을 첫 게시물로 재사용하기로 했음
    • 그래서 흐름이 약간 이상하게 느껴질 수도 있음
    • 월요일에는 유용한 것을, 금요일에는 좀 더 특이한 것을 찾으려고 했음
    • 제목도 마찬가지로, Python을 사용하면서 흥미롭게 느낀 14가지 기능을 모은 것임
    • 제목을 생각하는 데 5초 정도밖에 쓰지 않았음
  • Python을 사용할 때마다 코드가 Python을 잘못 사용한 것처럼 보일까 걱정됨

    • Python에 대해 몰랐던 깊이 있는 내용이나 변화에 놀라움
    • Go는 코드가 몇 년 후에도 뒤처지지 않을 것이라는 확신을 줌
    • 훌륭한 기사임
  • Python은 Python으로 남아야 하고, golang, Rust, Typescript는 각각의 철학과 디자인을 가져야 함

    • 28년 동안 4가지 언어로 코딩 중이며, Python의 변화가 마음에 들지 않음
    • Python이 인기를 얻은 이유는 타입 체크나 주석 같은 추가 레이어 때문이 아님
    • 다른 언어에서도 비슷한 것을 봤음
    • 최근 소개된 기능들의 포괄적인 목록임
    • 독자들이 유용하게 여길 수 있는 이전 목록도 있음
  • Python의 가장 큰 장점은 실행 가능한 의사 코드처럼 느껴진다는 것임

    • 언어가 도메인 수준의 지시사항을 방해하지 않음
    • 더 많은 기능을 추가할수록 매력이 떨어짐
    • 대부분의 사람들은 Python을 깊이 이해하지 못함
  • 9.3 단락 평가에 대한 지적: 빈 문자열이 있을 경우 평가가 다르게 이루어짐

    • if-else 절은 빈 문자열을 유효한 것으로 취급하지만, or 연산자는 None과 동등하게 취급함
  • Javascript/Typescript에서 Python으로 전환한 사람으로서 유용한 자원임

    • 타이핑 오버로드는 Javascript의 불행한 기능을 위한 것이며, 기술 부채로 간주함
    • 키워드 전용 및 위치 전용 인수는 구문이 너무 간결해서 가독성이 걱정됨
    • 미래 주석은 최근에 큰 도움이 되었음
    • 프로토콜은 Typescript와 비슷하지만 Python답지 않음
    • 메타클래스는 고유한 문제를 해결할 수 있는 강력한 도구임
  • 대부분의 기능은 고급 기능이 아님

    • 메타클래스는 복잡한 행동을 유도할 수 있어 피하는 편임
    • '프록시 속성'은 기능이 아님
  • 목록에서 바꾸고 싶은 것은 collections.abc 컨테이너의 포함임

    • 여러 댓글이 월러스 연산자를 싫어했지만, 좋은 용도를 찾고 나서는 유용하게 사용함
    • 정규 표현식 패턴을 사용할 때 코드가 훨씬 깔끔해짐
  • 이 글을 읽는 것이 즐거웠음

    • 대부분의 기능은 타이핑 모듈의 기능임
    • 제네릭이나 프로토콜에 대해 확신이 없었음
    • 현대의 생산 수준 Python 코드가 모든 곳에서 타입을 사용하는지 궁금함

for-else는 가독성이나 명확성이 높지 않다는 의견이 있어 안티 패턴으로 간주되는 경우가 많고, asyncio.Future는 asyncio의 내부적인 구현 디테일로 취급된다는 점을 참고하세요.

감사합니다. 특히 10번 바로 적용 들어갑니다.

AI 코딩 규칙 추가..

꿀팁 감사합니다