[Final] PEP 762 - REPL-acing the default REPL

원문 링크: PEP 762 - REPL-acing the default REPL

상태: Final 유형: Informational 작성일: 11-Oct-2024

PEP 762 – 기본 REPL 교체 (REPL-acing the default REPL)

초록 (Abstract)

이 PEP는 Python 3.13부터 도입될 새로운 REPL (Read-Eval-Print Loop), 즉 대화형 모드의 구현을 설명합니다. 새로운 REPL은 Python으로 작성되었으며, 다중 라인 편집, 구문 강조(syntax highlighting), 사용자 지정 명령(custom commands) 등 현대 사용자들이 기대하는 기능들을 제공하여 전반적인 대화형 경험을 개선하는 것을 목표로 합니다.

동기 (Motivation)

Python 3.12까지 CPython의 대화형 셸은 파서의 특별한 모드로 C로 작성되었습니다. 이로 인해 유지 보수 및 확장이 어려웠고, 커서 이동이나 히스토리 추적과 같은 기본 기능을 위해 GNU readline 또는 이에 상응하는 라이브러리에 의존했습니다. 이 라이브러리 없이 컴파일된 Python은 매우 제한적인 대화형 모드를 제공했습니다. 이러한 복잡성은 기여를 저해하고 새로운 기능 구현을 어렵게 만들었으며, 그 결과 CPython 대화형 셸은 현대적인 REPL에 대한 사용자 기대에 뒤처지게 되었습니다.

이전 버전의 REPL에는 다중 라인 편집 및 히스토리, 사용자 지정 명령, 구문 강조, 복사 및 붙여넣기(copy and paste)의 인체 공학적 처리와 같이 현대적인 REPL에서 사용자들이 기대하는 많은 기능이 없었습니다. 특히 종속성을 제어할 수 없고 자체 패키지를 설치할 수 없는 환경의 사용자들, 예를 들어 언어를 배우는 학습자나 교육자들에게는 이러한 기능 부족이 사용자 경험에 큰 영향을 미쳤습니다. C 구현에서 이러한 문제들을 해결하려면 AST 매칭과 같은 복잡한 해결책이 필요하여 코드베이스에 엄청난 복잡성을 추가할 것입니다.

새로운 REPL을 Python으로 작성함으로써, 이러한 한계점을 해결하고 CPython의 대화형 경험을 현대적인 기대치와 기능에 맞게 개선하고 있습니다.

근거 (Rationale)

새로운 REPL을 C 대신 Python으로 구현함으로써 기여자들의 진입 장벽이 크게 낮아졌습니다. 이 변화는 REPL을 테스트, 검증, 수정하기 쉽게 만들어 커뮤니티 참여를 늘리고 기능 개발 속도를 높였습니다. 코드베이스의 접근성 향상은 REPL이 더 빠르게 발전하고 사용자 요구에 더 잘 반응할 것으로 기대됩니다.

새로운 REPL 구현은 처음부터 작성하는 대신 PyREPL을 기반으로 합니다. 이는 여러 운영 체제 및 터미널 에뮬레이터에서 일관되게 작동하는 터미널 애플리케이션을 개발하는 것이 복잡한 작업이기 때문입니다. PyPy 프로젝트에서 검증된 PyREPL을 채택함으로써, 처음부터 시작하는 대신 기존의 검증된 코드를 활용할 수 있습니다.

REPL 구현을 위해 PyPy와 코드베이스를 공유하는 것은 두 프로젝트 모두에 상호 이점을 제공합니다. 이를 통해 유지 관리 노력 공유, 빠른 버그 수정 및 기능 개선이 가능해져 CPython과 PyPy 사용자 모두에게 이점을 줄 수 있습니다.

이전 C로 작성된 REPL은 탐색, 히스토리 보존 및 호출, 자동 완성, 구성 가능한 키보드 동작과 같은 특정 기능을 허용하기 위해 “readline” 또는 “editline” 라이브러리를 백엔드로 활용했습니다. PyREPL은 이러한 라이브러리를 사용하지 않고 대부분의 다른 기능을 셸의 일부로 직접 구현합니다. 비록 기존 readline/editline 구성이 PyREPL과 호환되지 않는다는 의미이지만, 향상된 기능과 개선된 확장성이 전반적으로 더 큰 이점이라고 판단합니다.

이전 REPL은 사용자 지정 명령을 제대로 구현하기 어렵게 만들었습니다. 예를 들어, exit 명령은 전역 네임스페이스에 삽입된 사용자 지정 객체의 메서드 호출로 구현되어, 사용자들이 단순히 exit을 입력했을 때 exit()과 같이 올바른 사용법을 프롬프트하는 등 직관적이지 않은 동작을 유발했습니다.

명세 (Specification)

PyREPL은 기존 C 구현과 함께 _pyrepl이라는 새로운 프라이빗 Python 모듈로 구현됩니다. 첫 번째 구현에서는 다음과 같은 주요 기능들을 도입합니다.

  • 다중 라인 히스토리 및 편집 (Multi-line History and Editing): 사용자는 여러 줄에 걸쳐 명령 히스토리를 탐색하고 편집할 수 있어 복잡한 코드 블록을 다듬고 재사용하는 능력이 향상됩니다.
    • 다중 라인 블록 편집 시 PEP 8 권장 사항과 일치하는 4칸 자동 들여쓰기를 제공합니다.
    • 위/아래 화살표 키를 사용하여 명령 히스토리에 접근할 수 있습니다.
    • Ctrl + S (정방향) 및 Ctrl + R (역방향) 또는 PageUpPageDown 키를 사용하여 히스토리를 검색할 수 있습니다.
  • 복사 및 붙여넣기 (Copying and Pasting): 지원되는 터미널 에뮬레이터에서는 브라켓 붙여넣기 기능(bracketed pasting)을 감지하고 사용하여 즉시 실행되거나 잘못된 자동 들여쓰기 없이 코드 블록을 투명하게 붙여넣을 수 있습니다.
    • 이 모드를 지원하지 않는 터미널 에뮬레이터의 경우, F3 키를 눌러 수동 붙여넣기 모드(manual paste mode)에 진입하여 여러 줄의 코드 스니펫을 쉽게 삽입할 수 있습니다.
    • F2 키를 통해 히스토리 보기(history view)에 진입하여 명령 프롬프트나 출력 없이 코드 블록을 복사할 수 있습니다.
  • F1을 통한 도움말 (Help via F1): 표준 Help 모듈은 F1 키를 통해 접근할 수 있습니다.
  • 사용자 지정 명령 (Custom Commands): exit과 같은 사용자 지정 명령 구현을 더 자연스럽고 사용자 친화적인 방식으로 지원하여 기존의 함수 호출 해결 방법을 피합니다.
    • 초기 사용자 지정 명령 목록에는 exit, quit, copyright, help, clear가 포함됩니다.
  • 색상 (Colors): 프롬프트 및 예외 트레이스백(exception tracebacks)과 같은 출력의 특정 요소에 색상이 적용됩니다. NO_COLOR, FORCE_COLOR, PYTHON_COLORS 환경 변수를 사용하여 색상을 제어할 수 있습니다.

이러한 기능들은 대화형 Python 경험을 크게 향상시키고, 현대적인 개발 환경 및 사용자 기대에 부합하게 만듭니다. Python으로 구현함으로써 다음과 같은 이점을 제공합니다.

  • 더 쉬운 테스트 및 검증 (Easier Testing and Validation): Python 코드는 C 코드보다 테스트 작성이 훨씬 간단하여 기존 및 이전 기능에 대한 더 포괄적인 테스트 커버리지를 가능하게 합니다.
  • 낮은 기여 장벽 (Lower Contribution Barrier): C에 비해 Python의 접근성은 더 많은 커뮤니티 기여를 장려하여 더 빠른 기능 개발 및 버그 수정을 이끌어냅니다.
  • 유연성 (Flexibility): Python 구현은 확장 및 수정이 더 쉬워 핵심 개발자와 기여자 모두에게 새로운 기능 및 개선 사항에 대한 개발 속도를 향상시킵니다.

하위 호환성 (Backwards Compatibility)

PyREPL 구현은 기존 Python 코드와의 완전한 하위 호환성을 유지하도록 설계되었습니다. 이전 기본 REPL은 폴백(fallback)으로 보존되며, 사용자 지정 워크플로우가 필요한 경우 또는 환경 제약으로 인해 새 REPL을 사용할 수 없는 경우에 사용할 수 있습니다. PYTHON_BASIC_REPL 환경 변수를 1로 설정하여 이전 기본 REPL을 명시적으로 선택할 수 있습니다.

PyREPL 도입으로 기존 기능이 제거되지 않습니다. PyREPL에서 사용할 수 없는 이전 기본 REPL의 모든 기능은 폴백으로 사용할 수 있는 이전 기본 REPL에 보존되고 유지됩니다. 특히 inputrc 또는 editrc 파일에서 사용자 지정 입력 구성을 계속 사용하려는 사용자는 이전 기본 REPL을 계속 사용할 수 있습니다. PyREPL에 inputrceditrc 지원은 명시적으로 계획되어 있지 않습니다.

부드러운 전환을 위해 PyREPL과 이전 기본 REPL 간 전환 방법에 대한 명확한 문서가 제공됩니다.

보안 영향 (Security Implications)

이 제안으로 인한 보안 영향은 없습니다.

교육 방법 (How to Teach This)

PyREPL 도입에는 문서와 튜토리얼이 동반됩니다. 교육의 주요 초점 영역은 다음과 같습니다.

  • 다중 라인 편집, 붙여넣기 모드 및 기타 새로운 기능 사용에 대한 자세한 설명.
  • 사용자 지정 명령 (기존 및 새로운 명령).
  • 이전 readline/editline 기반 구성과의 차이점을 포함하여 새 REPL로 전환하는 방법.

거부된 아이디어 (Rejected Ideas)

여러 대안적 접근 방식이 고려되었지만 궁극적으로 거부되었습니다.

  • 현재 C 구현 확장: 최대 하위 호환성을 유지하겠지만, 너무 복잡하고 근본적인 한계점을 해결하지 못할 것으로 판단되었습니다.
  • 새로운 REPL을 처음부터 개발: 크로스 플랫폼 터미널 애플리케이션 생성의 복잡성과 기존의 검증된 코드를 활용하려는 이유로 거부되었습니다.
  • 다른 기존 REPL 구현 사용: IPython, bpython, ptpython, xonsh와 같은 여러 대안을 검토했지만, PyREPL은 성숙도, 기능 세트 및 추가 종속성 부족의 조합으로 선택되었습니다. PyPy 구현과의 정렬도 주요 요인이었습니다.

⚠️ 알림: 이 문서는 AI를 활용하여 번역되었으며, 기술적 정확성을 보장하지 않습니다. 정확한 내용은 반드시 원문을 확인하시기 바랍니다.

Comments