C.W.K.
Stream
Lesson 03 of 07 · published

REPL 깊이 들어가기 — `>>> hello` 그 이상

~18 min · repl, ipython, 히스토리, 자동완성, underscore, exec-eval

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

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. 들여다보기, 찔러보기, 고치기, 다시 실행.

자기참조: cwkPippa 의 adapter layer 가 Claude streaming 중에 이상하게 동작하면, 보통 동작은 — 작은 repro 스크립트에 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 ipythonipython 으로 실행. %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 을 *살아있는 디버거* 로 다뤄.

Pythonic Way: *"이 객체가 진짜로 뭐 하는 거지?"* 에 막혔을 때 — 소스 먼저 읽지 마, Stack Overflow 먼저 검색하지 마. REPL 열고, 그 객체 import 하고, dir()help() 호출해. *"어떻게 동작해?"* 에 대한 Pythonic 답은 종종 — "객체한테 직접 물어봐."

Code

Tab 자동완성 + 히스토리 + underscore 트릭·python
>>> import string
>>> string.<TAB>           # Tab 누름 — string 모듈의 모든 이름 보여줌
string.ascii_letters     string.ascii_lowercase   string.ascii_uppercase
string.capwords(         string.digits            string.hexdigits
...

>>> 2 + 2
4
>>> _ * 10                 # _ 가 마지막 결과를 들고 있음
40
>>> _ + 5                  # 매번 업데이트
45

>>> # 위 화살표 — 직전 줄 다시 떠, 편집 가능 상태.
>>> # 시도해봐 — 뭔가 입력, 위, 편집, Enter.
help() 와 dir() — 객체에게 직접 물어보기·python
>>> dir("hello")
['__add__', '__class__', ..., 'capitalize', 'casefold', 'center',
 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format',
 'format_map', 'index', 'isalnum', ..., 'upper', 'zfill']

>>> help(str.upper)
Help on method_descriptor:

upper(self, /)
    Return a copy of the string converted to uppercase.

>>> # 인자 없는 help() → full 대화형 docs.
>>> # 어떤 help 화면이든 q 로 빠져나옴.
python -i script.py — 끝난 스크립트 위에 REPL·bash
# my_buggy_script.py
x = [1, 2, 3]
y = [n * 2 for n in x]
z = y[10]    # IndexError: list index out of range

$ python -i my_buggy_script.py
Traceback (most recent call last):
  File "my_buggy_script.py", line 3, in <module>
    z = y[10]
        ~^^^^
IndexError: list index out of range
>>> x          # 스크립트가 정의한 모든 이름 살아있음
[1, 2, 3]
>>> y
[2, 4, 6]
>>> len(y)     # 아 — 3개뿐인데 10 인덱싱이 말이 안 됐어
3
>>> # 들여다보기, 스크립트 고치기, python -i 로 다시.
ipython 투어 — 뭐가 다른가·python
$ pip install ipython
$ ipython

In [1]: %timeit sum(range(1000))     # magic command — 마이크로 벤치마크
8.42 µs ± 50.1 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

In [2]: %run myscript.py             # 현재 namespace 에서 파일 실행

In [3]: import requests
In [4]: r = requests.get("https://api.github.com")
In [5]: r.<TAB>                       # ipython 의 자동완성이 더 풍부

In [6]: r?                            # ?  하나 — docstring
In [7]: r??                           # ?  둘 — 소스 코드

In [8]: history                       # 전체 세션 히스토리, 줄 번호 포함
eval/exec — 보안 함정 (사용자 입력에 절대 X)·python
# 위험 — 사용자 입력에 *절대* 이렇게 하지 마.
user_expr = input("수식: ")
result = eval(user_expr)              # 임의 코드 실행
# 사용자가 입력: __import__('os').system('rm -rf ~')
# 게임 끝.

# 안전한 대안 — 수식 / literal:
import ast
user_expr = input("수식: ")
result = ast.literal_eval(user_expr)  # literal 만 — 안전

# 안전한 대안 — JSON 입력:
import json
data = json.loads(input("JSON: "))    # 파서, 평가기 아님

External links

Exercise

ipython install (pip install ipython) 하고 실행. lesson 1 의 세 코드 블록을 ipython 안에서 다시 해봐. 맨 REPL 과의 차이를 봐 — 프롬프트 형식, 자동 pretty-printing, 컬러 출력. 그 다음 print? (물음표 하나), len?? (둘) 시도하고 — 각각 뭐가 다른지 봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.