인터랙티브 입력 편집과 히스토리 치환

인터랙티브 입력 편집과 히스토리 치환 (Interactive Input Editing and History Substitution)

Python 인터프리터는 어떤 계열에서는 지금 입력하고 있는 줄을 편집하거나, 예전에 입력했던 명령을 다시 불러오는 '히스토리 치환'을 지원해요. Korn 셸이나 GNU Bash 셸에서 익숙한 그 기능 말이죠. 이걸 가능하게 해 주는 건 GNU Readline 라이브러리인데, 이 라이브러리 자체가 워낙 방대해 여기서는 그 문서를 다시 옮겨 적지 않고, Python에서 쓰는 방법 위주로 설명할게요.

출처: Python 공식 문서

탭 완성과 히스토리 편집

변수 이름이나 모듈 이름의 **완성(tab completion)**은 인터프리터를 시작할 때 자동으로 켜져요. 그래서 Tab 키만 누르면 완성 함수가 동작합니다. 이 함수는 Python 문장의 이름 목록, 현재 지역 변수, 그리고 불러올 수 있는 모듈 이름을 살펴봐요. string.a처럼 점이 붙은 표현이라면, 마지막 . 앞까지만 먼저 평가한 뒤 그 결과 객체의 속성들에서 후보를 골라 제안해 줘요. 여기서 한 가지 주의할 점이 있는데, __getattr__() 메서드를 가진 객체가 그 표현식에 포함돼 있으면 애플리케이션 정의 코드가 실제로 실행될 수도 있다는 거예요.

기본 설정은 또 여러분이 입력한 히스토리를 사용자 디렉터리의 .python_history라는 파일에 저장해 둡니다. 덕분에 다음에 인터랙티브 인터프리터를 다시 시작해도 예전에 쳤던 명령을 그대로 쓸 수 있어요.

인터랙티브 인터프리터의 대안

이 편집 기능은 예전 버전의 인터프리터에 비하면 어마어마한 진보지만, 아직 아쉬운 점도 남아 있어요. 예를 들면 계속 줄(continuation line)에서 적절한 들여쓰기를 알아서 제안해 주면 좋겠고(파서는 다음에 INDENT 토큰이 필요한지 이미 알고 있죠), 완성 메커니즘이 인터프리터의 심볼 테이블을 이용하게 할 수도 있겠어요. 또 괄호나 따옴표가 서로 맞는지 확인(또는 제안)해 주는 명령도 있으면 유용하겠죠.

좀 더 강화된 인터랙티브 인터프리터가 오래전부터 하나 있었는데 바로 IPython이에요. 탭 완성, 객체 탐색, 고급 히스토리 관리 기능을 갖췄고, 깊이 있게 커스터마이즈하거나 다른 애플리케이션에 임베드할 수도 있습니다. 비슷한 강화 환경으로는 bpython도 있어요.

더 알아보기 (Learn more)