PEP 762 – 기본 REPL 교체
- Author:
- Pablo Galindo Salgado <pablogsal at python.org>, Łukasz Langa <lukasz at python.org>, Lysandros Nikolaou <lisandrosnik at gmail.com>, Emily Morehouse-Valcarcel <emily at python.org>
- Sponsor:
- Pablo Galindo Salgado
- Status:
- Final
- Type:
- Informational
- Created:
- 11-Oct-2024
- Python-Version:
- 3.13
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
Python의 핵심 강점 중 하나는 대화형 모드이며, Read-Eval-Print Loop(REPL), Python 콘솔 또는 Python 셸이라고도 합니다. 이 PEP는 Python으로 작성된 이 기능의 새로운 구현을 설명합니다. Python 3.13에서 출시된 새로운 REPL은 여러 줄 편집, 구문 강조, 사용자 지정 명령, 전반적으로 개선된 대화형 경험 등 오늘날 사용자들이 기대하는 현대적 기능을 제공하는 것을 목표로 합니다.
동기
Python 3.12까지 CPython의 대화형 셸은 파서의 특수 모드로서 C로 작성되었습니다. 따라서 이를 유지 관리하고 확장하기가 어려웠습니다. 커서 이동과 기록 추적 같은 기본 기능을 위해 GNU readline(또는 이에 상응하는 기능)의 존재에 의존했습니다. 이 라이브러리 없이 컴파일된 Python은 기능이 매우 제한적인 대화형 모드를 제공했습니다. 반면 readline과 함께 컴파일된 Python은 사용자 입력과 관련된 결정 및 설정을 외부에 맡기는 방식이어서 이를 확장하기가 어려웠습니다.
이러한 복잡성은 기여를 위축시켰으며 새로운 기능을 구현하기 어렵게 만들었습니다. 그 결과 CPython의 대화형 셸은 변경 사항이 거의 없었고, 현대적인 대안에 대한 사용자들의 기대에 뒤처졌습니다.
사용자가 현대적인 REPL에서 기대하게 된 많은 기능이 이전 버전에는 없었습니다. 이러한 기능의 예로는 여러 줄 편집 및 기록, 사용자 지정 명령, 구문 강조, 복사 및 붙여넣기를 편리하게 처리하는 기능 등이 있습니다. 이러한 기능의 부재는 CPython 사용자의 여러 집단이 경험하는 사용자 경험에 큰 영향을 미치며, 특히 사용자가 의존성을 관리할 수 없고 자체 패키지를 설치할 수 없는 환경에서 그러합니다. 이는 특히 언어를 배우는 사용자와 교육자에게 흔합니다.
C 구현으로 이러한 문제를 해결하려면 명령의 AST 매칭과 같은 복잡한 우회 방법이 필요하며, 이는 코드베이스에 감당하기 어려운 복잡성을 더하게 됩니다.
Python으로 작성된 새로운 REPL을 통해 이러한 제한을 해결하는 동시에 CPython의 대화형 경험을 현대적인 기대와 기능에 더욱 부합하도록 개선하고 있습니다.
근거
새로운 REPL을 C가 아닌 Python으로 구현함으로써 기여자가 참여하기 위한 장벽이 크게 낮아졌습니다. 이러한 변경으로 REPL을 테스트하고 검증하며 수정하기가 쉬워졌고, 그 결과 커뮤니티 참여가 늘어나고 기능 개발이 빨라졌습니다. 코드베이스의 향상된 접근성은 더욱 빠르게 발전하고 사용자 요구에 민감하게 반응하는 REPL로 이어질 것으로 예상됩니다.
Python REPL을 처음부터 작성하는 대신, 새로운 REPL 구현을 PyREPL을 기반으로 하기로 결정했습니다. 이러한 결정에는 몇 가지 주요 요인이 작용했습니다. 무엇보다도 서로 다른 운영 체제와 터미널 에뮬레이터에서 일관되게 작동하는 터미널 애플리케이션을 개발하는 일은 복잡한 작업입니다. PyPy 프로젝트에서 실전 검증을 거친 PyREPL을 도입하면 처음부터 시작하는 대신 기존의 검증된 코드를 활용할 수 있습니다.
REPL 구현을 위해 PyPy와 코드베이스를 공유하면 두 프로젝트 모두 상호 이점을 얻을 수 있습니다. 이를 통해 유지 관리 작업을 공동으로 수행하고 버그를 더 빠르게 수정하며 기능을 개선할 수 있고, 이는 CPython과 PyPy 사용자가 모두 혜택을 받을 수 있습니다. 이러한 협업은 전체 Python 생태계를 위해 더욱 견고하고 기능이 풍부한 REPL로 이어질 수 있습니다.
C로 작성된 이전 REPL은 탐색, 기록 보존 및 재호출, 자동 완성, 구성 가능한 키보드 동작 등의 특정 기능을 제공하기 위해 “readline” 또는 “editline” 라이브러리를 백엔드로 활용했습니다. PyREPL은 이러한 라이브러리를 사용하지 않고, 대부분의 다른 기능을 셸의 일부로 직접 구현합니다. 새 아키텍처의 이점이 주요 누락 기능(입력 구성 가능성)을 능가합니다. 이러한 라이브러리의 구성 파일(예: inputrc)은 복잡하며 PyREPL이 구현할 계획이 없는 기능도 포함하므로, 새 셸에서 이를 투명하게 지원하는 것은 실행 불가능합니다. PyREPL에서 “readline” 또는 “editline”을 사용하는 것은 여러 줄 편집 처리와 다중 플랫폼 지원 때문에 지나치게 복잡합니다.
이는 기존 readline/editline 구성이 PyREPL과 호환되지 않음을 의미하지만, 향상된 기능과 개선된 확장성이 전반적으로 더 큰 이점을 제공한다고 생각합니다. 사용자 지정 워크플로에 대한 지속적인 지원은 “하위 호환성”을 참조하십시오.
이전 REPL에서는 사용자 지정 명령을 제대로 구현하기가 어려웠으며, 이는 대화형 셸에서 매우 흔한 기능입니다. 예를 들어 exit 명령은 전역 네임스페이스에 삽입된 사용자 지정 객체의 메서드 호출로 구현되었으므로, 사용자가 단순히 exit를 입력하면 인터프리터가 올바른 사용법으로 보이는 exit()를 입력하라고 안내하는 직관적이지 않은 동작이 발생하여 사용자를 자주 혼란스럽게 했습니다.
명세
PyREPL은 _pyrepl이라는 새로운 비공개 Python 모듈로 구현되며, 현재의 C 구현과 나란히 존재합니다. 첫 번째 구현에서는 다음과 같은 주요 기능을 도입합니다.
- 여러 줄 기록 및 편집: 사용자는 여러 줄에 걸쳐 명령 기록을 탐색하고 편집할 수 있어, 복잡한 코드 블록을 다듬고 재사용하는 기능이 향상됩니다.
여러 줄 블록을 편집할 때 네 칸을 사용하는 자동 들여쓰기가 제공되며, 이는 PEP 8 권고 사항과 일치합니다. 콜론으로 끝나는 줄을 만나면, 들여쓰기가 포함된 첫 번째 줄에서 추론한 들여쓰기 패턴을 활용하여 다음 줄을 자동으로 들여씁니다. 줄은 네 칸으로 들여쓰며, 탭은 공백으로 변환됩니다.
사용자는 up 및 down 화살표를 사용하여 명령 기록에 접근할 수 있습니다. 여러 줄 항목 내에서는 다음 기록 항목으로 이동하기 전에 화살표 키가 블록 내에서 한 줄씩 탐색합니다. 역순으로 작동하는 down 화살표는 이전 항목에서 가장 최근 항목으로 이동합니다.
사용자가 지정한 부분 문자열 검색어를 사용하여 기록을 정방향으로(Ctrl+S 사용) 또는 역방향으로(Ctrl+R 사용) 검색할 수 있습니다. 셸 줄에 접두사를 입력하고 PageUp 및 PageDown 키를 사용하여 접두사 검색어로 검색할 수도 있습니다.
- 복사 및 붙여넣기: 지원되는 터미널 에뮬레이터에서는 PyREPL이 괄호 묶음 붙여넣기 기능을 검색하여 사용합니다. 이를 통해 코드 블록을 즉시 실행하거나 잘못된 자동 들여쓰기를 적용하지 않고 투명하게 붙여넣을 수 있습니다.
이 모드를 지원하지 않는 터미널 에뮬레이터에서는 즉시 실행이나 들여쓰기 문제를 일으키지 않고 여러 줄 코드 조각을 쉽게 삽입할 수 있도록 전용 붙여넣기 모드를 구현합니다.
사용자는 F3 키를 눌러 수동 붙여넣기 모드로 들어갑니다. 프롬프트가
>>>에서(paste)로 변경되며, 사용자는 클립보드의 내용을 붙여넣거나 원하는 대로 직접 입력할 수 있습니다. 내용이 준비되면 F3 키를 눌러 붙여넣기 모드를 종료합니다. 그런 다음 Enter 키를 누르면 블록이 실행됩니다.붙여넣기 모드를 사용할 때 한 번의 입력으로 여러 명령을 입력할 수 있어, 다른 출처의 코드를 붙여넣는 데 도움이 됩니다.
앞에 붙는 명령 프롬프트와 명령 출력 없이 코드 블록을 복사하려면 F2 키를 통해 기록 보기로 들어갈 수 있습니다. 이 모드에서는 페이저를 사용하여 프롬프트와 출력 없이 실행된 명령의 기록을 표시합니다.
- 도움말은 F1을 통해 이용할 수 있습니다.
표준 Help 모듈은 사용자 정의 명령
help(아래 참조) 또는 F1 키를 통해 액세스할 수 있습니다. 도움말 모드로 들어가려면 F1을 누르십시오. 작업을 마치면 F1 키 또는 표준 명령(q,quit또는exit)을 눌러 종료하십시오.대화형 도움말을 탐색해도 명령 기록은 유지되지 않습니다.
- 사용자 정의 명령: REPL은 현재의 함수 호출 우회 방법을 사용하지 않고
exit와 같은 사용자 정의 명령을 더욱 자연스럽고 사용자 친화적인 방식으로 구현할 수 있도록 지원합니다.사용자 정의 명령의 초기 목록에는 다음이 포함됩니다.
exitquitcopyrighthelpclear
명령은 접근 가능한 스코프의 변수와 이름 충돌이 없는 동안 사용할 수 있습니다. 예를 들어
exit = 1을 할당하면 변수가 PyREPL 명령보다 우선합니다. 이 경우del exit의 실행으로 충돌이 제거되고 명령이 다시 작동합니다. - 색상: 프롬프트와 예외 트레이스백 같은 출력의 특정 요소가 이제 색상으로 표시됩니다. 표준
NO_COLOR환경 변수를 사용하여 색상을 비활성화하거나, 표준FORCE_COLOR환경 변수를 사용하여 색상을 강제로 활성화할 수 있습니다.PYTHON_COLORS라는 Python 전용 환경 변수도 사용할 수 있습니다. Python 3.13의 초기 구현에서는 색상 테마를 사용자 지정할 수 없습니다.
이러한 기능은 대화형 Python 환경을 크게 향상하여 최신 개발 환경과 사용자 기대에 더욱 부합하도록 합니다. 구현은 Python으로 작성되어 있으며, 다음과 같은 여러 장점을 제공합니다.
- 더 쉬운 테스트 및 검증: Python 코드의 테스트 작성은 C 코드보다 훨씬 간단하고 직관적이므로, 모든 기존 및 이전 기능을 더욱 포괄적으로 테스트할 수 있습니다.
- 기여 장벽 완화: C에 비해 Python의 접근성이 높아 더 많은 커뮤니티 기여가 이루어지고 있으며, 그 결과 기능 개발과 버그 수정이 더 빠르게 진행됩니다.
- 유연성: Python 구현은 확장 및 수정이 더 쉬우므로, 핵심 개발자와 기여자 모두가 새로운 기능과 개선 사항을 더 빠르게 개발할 수 있습니다.
하위 호환성
PyREPL 구현은 기존 Python 코드와의 완전한 하위 호환성을 유지하도록 설계되었습니다. 기존 기본 REPL은 대체 수단으로 보존되며 사용자 정의 작업 흐름에 필요한 경우 요청에 따라 사용할 수 있습니다. 또한 환경적 제약이나 기타 문제로 인해 새 REPL을 사용할 수 없는 경우에도 사용됩니다. 사용자는 환경 변수 PYTHON_BASIC_REPL을 1로 설정하여 기존 기본 REPL을 명시적으로 선택할 수 있습니다. 이를 통해 사용자는 원할 경우 익숙한 인터페이스와 기능을 계속 사용하거나, 새 구현에서 문제가 발생하더라도 계속 사용할 수 있습니다.
PyREPL의 도입으로 기존 기능이 제거되는 것은 아니라는 점을 강조하는 것이 중요합니다. PyREPL에서 사용할 수 없는 기존 기본 REPL의 모든 기능은 사용자가 대체 수단으로 사용할 수 있는 기존 기본 REPL에 보존되고 유지됩니다.
특히 inputrc 또는 editrc 파일에서 사용자 정의 입력 구성을 계속 사용하려는 사용자는 기존 기본 REPL을 계속 사용할 수 있습니다.
저자들은 어떠한 PyREPL 기능도 기존 기본 REPL로 이식될 것으로 예상하지 않습니다. 마찬가지로 PyREPL에서는 inputrc 및 editrc 지원을 명시적으로 계획하지 않습니다. 해당 구성 파일은 “readline” 및 “editline” 라이브러리가 제공하고 구문 분석하며, 이들의 기능 범위는 PyREPL이 목표로 하는 기능과 일치하지 않습니다.
원활한 전환을 지원하기 위해 PyREPL과 기존 기본 REPL 간 전환 방법에 관한 clear documentation가 제공됩니다.
이 접근 방식은 새로운 REPL에 상당한 개선 사항을 도입하면서도 현재 구현에 의존하는 사용자에게 즉각적인 변경을 강요하지 않도록 합니다. 폴백 메커니즘과 사용자 선택 옵션은 기존의 모든 기능을 유지하면서 새로운 REPL을 점진적으로 도입할 수 있도록 하는 안전망을 제공합니다.
보안 관련 사항
이 제안으로 인해 발생하는 보안 관련 사항은 없습니다.
이 내용을 가르치는 방법
PyREPL의 도입에는 문서와 튜토리얼이 함께 제공됩니다. 교육에서 중점적으로 다룰 영역은 다음과 같습니다.
- 여러 줄 편집, 붙여넣기 모드 및 기타 새로운 기능의 사용 방법에 관한 자세한 설명입니다.
- 사용자 지정 명령(기존 명령 및 새로운 명령)입니다.
- 새로운 REPL로 전환하는 방법과 이전의 readline/editline 기반 구성과의 차이점입니다.
거부된 아이디어
몇 가지 대안이 고려되었으나 최종적으로 거부되었습니다.
- 현재 C 구현 확장: 이는 최대한의 하위 호환성을 유지할 수 있지만, 너무 복잡하고 앞서 설명한 근본적인 한계를 해결하지 못할 것으로 판단되었습니다.
- 새로운 REPL을 처음부터 개발: 크로스 플랫폼 터미널 애플리케이션을 만드는 복잡성과 기존의 검증된 코드를 활용하려는 목적 때문에 이 접근 방식은 거부되었습니다.
- 기존의 다른 REPL 구현 사용: 저자들은 IPython, bpython, ptpython, xonsh와 같은 여러 대안을 검토했습니다. 위의 모든 프로젝트가 인상적이지만, 최종적으로 PyREPL은 성숙도, 기능 집합 및 추가 종속성의 부재를 종합적으로 고려하여 선택되었습니다. 또 다른 핵심 요인은 PyPy의 구현과의 정렬이었습니다.
감사의 말
이 PEP의 초안에 의견을 제공해 주신 Diego Russo에게 감사드립니다.
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.