Python 타입 시스템의 진화
PEP 827은 TypeScript에서 영감을 받은 프로그래밍 가능한 타입 조작 기능을 Python에 도입하는 제안으로, 정적 타이핑과 메타프로그래밍, 프레임워크의 사용 편의성을 한 단계 끌어올리는 것을 목표로 합니다.
약 1년간의 연구 성과를 공유하게 되어 기쁩니다. 이 연구의 목표는 Python의 타입 시스템을 더 표현력 있고 조합 가능하게 만드는 것으로, TypeScript의 프로그래밍 가능한 타입에 가까운 기능을 Python의 런타임 모델에 맞게 설계하는 작업이었습니다. 그 결과물이 바로 PEP 827: Type Manipulation입니다.
Python의 런타임은 놀라울 만큼 강력합니다. 클래스, 메서드, 심지어 API 전체를 단 몇 줄의 코드로 동적으로 생성할 수 있습니다. 메타프로그래밍으로 클래스 선언을 변환하거나, 데코레이터로 함수와 메서드에 부가 동작을 부여하는 것은 그중 일부에 불과합니다.
하지만 Python의 정적 타이핑은 타입 체커 플러그인이나 보일러플레이트 코드 없이는 이러한 동적 동작을 제대로 따라가지 못하는 경우가 많습니다. PEP 827은 기존 타입을 검사하고 새로운 타입을 구성하기 위한 표준 타입 수준 빌딩 블록을 제안하며, 타입 체커와 런타임 도구 모두를 지원하도록 설계되었습니다.
FastAPI 창시자 Sebastián Ramírez는 Python Discourse에 올린 글에서 이 제안의 잠재적 영향력을 잘 요약해 주었습니다:
맛보기
대표적인 예로, TypeScript에서 익숙한 유틸리티 타입인 Pick과 Omit를 들 수 있습니다. 아래는 Pick를 TypeScript와 Python으로 나란히 구현한 모습입니다:
TypeScript의 전용 타이핑 문법은 간결하고 핵심에 집중하지만, 언어의 나머지 부분과는 상당히 이질적입니다. 반면 Python은 기존의 명령형 문법에 타입 수준 API를 결합하는 방식을 택합니다.
이번에는 Omit를 어떻게 구현할 수 있는지 살펴보겠습니다:
흥미로운 점은, Python 버전이 Pick 구현과 거의 동일한 구조를 따르며 조건만 반전시키면 된다는 것입니다. 반면 TypeScript는 조합 방식이 상당히 달라 더 깊은 수준의 재작성이 필요합니다.
이 예제가 보여주는 핵심 아이디어는 "Python을 TypeScript처럼 만들자"가 아닙니다. Python의 의미 체계에 맞으면서 런타임에서도 검사 가능한 프로그래밍 가능한 타입 핵심 기능을 제공하여, Pydantic 같은 프레임워크까지 함께 혜택을 받을 수 있도록 하는 것입니다.
향후 계획
PEP은 논의와 수정을 거치며, 때로는 거부되기도 합니다. 저희는 이 과정에 참여하게 되어 기대가 큽니다. TypeScript와 Python 양쪽 생태계에서 개발하고 있기에, 두 생태계가 모두 발전하길 바라는 마음으로 이 연구에 투자했습니다.
이런 의문이 들 수 있습니다. 에이전트가 소스 코드의 상당 부분을 작성하는 시대에, 프로그래밍 언어의 문법이나 도구, 타입 시스템의 역량이 여전히 중요한 것일까?
저희의 답은 "그 어느 때보다 중요하다"입니다. 타입 체커가 더 철저하게 검증하고, 프레임워크가 더 풍부한 표현력을 갖추어야, 리뷰하기 쉽고 간결한 코드를 안전하게 배포할 수 있습니다. 유지보수해야 할 보일러플레이트가 적을수록 좋고, 이 원칙은 앞으로도 변하지 않을 것입니다.
그러니 에이전트도 타입 시스템을 신경 쓸 것이고, 저희 역시 마찬가지입니다.
