REPL 은 *항상 켜져 있는 디버거*
대부분 언어가 어떤 형태로든 대화형 셸을 가지고 있는데, Python 에선 그게 *언어 사용의 일급 부분*. 가르치는 장난감이 아니야. REPL 은 — 파일 쓰기 전에 아이디어 스케치하는 자리, 프로그램 재시작 없이 *살아있는 객체* 디버깅하는 자리, 리팩터 commit 하기 전에 *"이 메서드가 진짜로 내가 생각한 걸 반환하나?"* 확인하는 자리.
Python 3.13 과 함께 온 버전은 드디어 — 제대로 된 multi-line 편집, syntax highlighting, 훨씬 개선된 help / exit 경험. 3.13+ 라면 이미 들고 있어. 3.12 이하면 — 이 lesson 이 같은 quality of life 위해 뭐 install 할지 (ipython, bpython) 다뤄.
놓쳤을 가능성 큰 built-in 기능들
맨 python REPL 만 해도 대부분 사람이 발견 못 한 기능들 있어:
- 위/아래 화살표 — 입력 히스토리 왔다갔다. 위 한 번 누르면 직전 expression 다시 떠, 편집 가능 상태로.
- Tab — 속성명 / 메서드명 / 심지어 로컬 변수까지 자동완성.
str.치고 Tab — str 의 모든 메서드 list 돼. _(언더스코어) 변수 — 프롬프트에서 마지막에 평가된 expression 의 결과를 *항상* 들고 있어.2 + 2친 다음 줄에_ * 10치면 40. 이런 chain 이 REPL 의 진짜 무기.help(thing)— 어떤 객체든 docstring 열어줘 (함수, 클래스, 모듈). 빠져나오기 —q.dir(thing)— 객체의 모든 속성 + 메서드 list. help 보다 덜 다듬어졌지만, 빠짐없음.
help() 만 치면 Python 의 full 대화형 help 시스템 진입 — docs.python.org 와 같은 문서를 프롬프트에서 직접 열람. offline 일 때 또는 브라우저로 context switch 하기 싫을 때 유용.
3.13 의 multi-line 편집
3.13 이전 REPL 의 유명한 단점 — multi-line 블록 (함수 정의, for-loop) 입력 시작하면 *앞 줄 다시 편집 불가*. 5 줄짜리 함수의 1 번 줄에서 오타? 취소하고 처음부터 다시 타이핑.
Python 3.13 의 새 REPL 이 이걸 고쳤어. 진행 중인 블록의 앞 줄로 위 화살표 진입해서 편집 + 전체 실행. F1 — 인라인 help. F2 — 히스토리 검색. F3 — paste 모드 (들여쓰기된 코드를 auto-indenter 와 싸우지 않고 paste).
python -i script.py — 스크립트 끝나면 REPL 진입
python 명령어의 *고-leverage* 플래그 중 하나. python -i myscript.py 는 스크립트를 평소처럼 실행하고 — 끝나면 (또는 crash 하면) REPL 떨어지는데, 스크립트가 정의한 *모든 변수 / 함수 / 클래스* 가 namespace 에 살아있어.
pdb 나 IDE 셋업 없이 스크립트 디버깅하는 방법. 뭔가 crash 하면 traceback 출력되고, 그 다음 >>> 가 떠 — crash 시점의 *모든 state* 에 full access. 들여다보기, 찔러보기, 고치기, 다시 실행.
python -i. 스크립트가 stream 중간에 crash, REPL 이 *반쯤 만들어진 response 객체* 와 함께 나를 떨궈주고, 2 분 찔러보면 버그가 명백. 디버거 셋업 없음, breakpoint 없음 — *시체가 아직 따뜻한* REPL 만.
ipython 과 bpython — 초능력 가진 REPL 들
3.13 의 개선 후에도 알아둘 가치 있는 third-party REPL 둘:
- ipython — 데이터 사이언스 REPL. Magic commands (
%timeit,%run,%load), 더 좋은 traceback, 자동 pretty-printing, Jupyter 노트북 통합.pip install ipython후ipython으로 실행.%timeit한 번 쓰고 나면 맨 REPL 이 원시적으로 느껴져. - bpython — 가벼움, 예쁜 UI, 타이핑 중 인라인 auto-suggestion. ipython 만큼 기능 많진 않지만 *가벼운 탐색* 에 더 쾌적.
pip install bpython.
둘 다 필요는 없어. 하나 골라 (대부분 개발자가 ipython 으로 정착) default install kit 에 추가.
exec() 와 eval() — 언제, 왜, 그리고 보안 노트
두 built-in 함수가 가끔 초보자를 유혹해 — eval(string) 은 Python expression 평가, exec(string) 은 Python statement 실행. 둘 다 문자열 받아서 코드로 돌려.
유혹 — *"사용자가 수식 입력하면 답 계산해주고 싶음"* → eval(input()). 현실 — 그 한 줄이 사용자에게 __import__('os').system('rm -rf ~') 입력 권한을 주고, 머신이 불탐.
eval 또는 exec 에 *절대* 통과시키지 마. 사용자 입력 파싱 위해 손이 가면 — 진짜 필요한 건 ast.literal_eval (안전 — literal 만 평가, 숫자 / 문자열 / list 등) 또는 pyparsing 같은 진짜 파서, 또는 입력이 JSON 이면 그냥 json.loads. 신뢰 못할 입력에 eval 은 *추가 단계가 있는 임의 코드 실행 취약점*.
그렇다고 두 함수가 쓸모 없는 건 아니야 — 런타임 코드 생성, REPL 구현, 동적 클래스 빌드. 표준 라이브러리 트랙에서 context 와 함께 다시 봐.
요약
REPL 은 *초보자 전용 도구* 가 아니야. 베테랑 Python 개발자 다수가 *탐색 작업* 은 에디터보다 ipython 에서 더 많이 시간 보내. 4 기본 (히스토리, Tab 자동완성, _, help/dir) 마스터 + ipython install + REPL 을 *살아있는 디버거* 로 다뤄.
dir() 과 help() 호출해. *"어떻게 동작해?"* 에 대한 Pythonic 답은 종종 — "객체한테 직접 물어봐."