Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 인터프리터 기본 클래스 완벽 정리: code 모듈로 REPL 환경 구축하기

Python의 대화형(인터랙티브) 모드는 REPL(Read-Evaluate-Print-Loop, 읽기-평가-출력-반복) 원리로 동작합니다. Python 표준 라이브러리의 code 모듈은 스크립트 내부에서 REPL 환경을 직접 구축할 수 있도록 다양한 클래스와 편의 함수를 제공합니다.

code 모듈의 주요 클래스

code 모듈에는 다음 두 가지 클래스가 정의되어 있습니다.

InteractiveInterpreter

소스 코드의 파싱과 인터프리터 상태(사용자 네임스페이스)를 담당하는 클래스입니다.

InteractiveConsole

대화형 Python 인터프리터의 동작을 거의 그대로 재현하는 클래스입니다.

code 모듈의 편의 함수

모듈에는 두 가지 편의 함수가 포함되어 있습니다.

  • interact(): 읽기-평가-출력 루프(REPL)를 간편하게 실행할 수 있는 편의 함수입니다.
  • compile_command(): Python 인터프리터의 메인 루프(REPL)를 흉내 내고자 하는 프로그램에 유용하게 사용되는 함수입니다.

InteractiveInterpreter 메서드

  • runsource(): 인터프리터에서 소스 코드를 컴파일하고 실행합니다.
  • runcode(): 코드 객체(code object)를 실행합니다.

InteractiveConsole 메서드

InteractiveConsole 클래스는 InteractiveInterpreter의 하위 클래스이므로 앞서 소개한 메서드들을 자동으로 사용할 수 있습니다. 여기에 추가로 다음 메서드들이 정의되어 있습니다.

  • interact(): 대화형 Python 콘솔과 거의 동일하게 동작합니다.
  • push(): 소스 텍스트 한 줄을 인터프리터에 전달합니다.
  • resetbuffer(): 입력 버퍼에서 아직 처리되지 않은 소스 텍스트를 제거합니다.
  • raw_input(prompt=""): 프롬프트를 출력하고 기본적으로 sys.stdin에서 한 줄을 읽어 들입니다.

예제

import code

x = 10
y = 20

def add(x, y):
    return x + y

print(add(x, y))
code.interact(local=locals())
print(x, y)
print(add(x, y))

위 코드에서는 두 개의 변수를 정의하고 함수에 전달한 뒤, 대화형 콘솔을 호출합니다. local=locals() 인자를 사용하면 현재 지역 네임스페이스를 인터프리터 루프 내에서 기본값으로 활용할 수 있습니다.

대화형 콘솔 안에서 변수에 다른 값을 할당한 후 Ctrl+D를 눌러 콘솔을 종료하면, 변경된 값들이 이후 코드 실행에 그대로 반영됩니다.

실행 결과

addition = 30
Python 3.6.6 |Anaconda custom (64-bit)| (default, Oct 9 2018, 12:34:16)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> x = 100
>>> y = 200
>>>

now exiting InteractiveConsole...
100 200
addition = 300