code — 인터프리터 기반 클래스

code — 인터프리터 기반 클래스

code 모듈은 Python에서 읽기-평가-출력 루프(read-eval-print loop)를 구현하기 위한 기능을 제공해요. 두 개의 클래스와 편의 함수가 들어 있어서, 인터랙티브 인터프리터 프롬프트를 제공하는 애플리케이션을 만드는 데 쓸 수 있습니다.

출처: Python 표준 라이브러리

본문

클래스

class code.InteractiveInterpreter(locals=None)

이 클래스는 파싱과 인터프리터 상태(사용자의 네임스페이스)를 다뤄요. 입력 버퍼링이나 프롬프팅, 입력 파일 이름 지정(파일 이름은 항상 명시적으로 넘김)은 다루지 않아요. 선택적 locals 인자는 코드가 실행될 네임스페이스로 쓸 매핑을 지정하며, 기본값은 '__name__''__console__', '__doc__'None으로 설정된 새로 만든 딕셔너리입니다.

InteractiveInterpreter 인스턴스 아래에서 만들어진 함수·클래스 객체는 locals로 지정된 네임스페이스에 속한다는 점에 주의하세요. locals가 기존 모듈의 네임스페이스일 때만 pickle할 수 있어요.

class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)

인터랙티브 Python 인터프리터의 동작을 가깝게 모방해요. InteractiveInterpreter를 기반으로 하면서, 익숙한 sys.ps1/sys.ps2를 이용한 프롬프팅과 입력 버퍼링을 추가해요. local_exit이 참이면 콘솔에서 exit()/quit()SystemExit을 일으키지 않고 호출 코드로 돌아갑니다.

버전 3.13 변경: local_exit 매개변수가 추가되었어요.

code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)

읽기-평가-출력 루프를 실행하는 편의 함수예요. InteractiveConsole의 새 인스턴스를 만들고, readfunc가 주어지면 InteractiveConsole.raw_input() 메서드로 사용할 수 있게 설정해요. local이 주어지면 인터프리터 루프의 기본 네임스페이스로 쓰도록 InteractiveConsole 생성자에 전달됩니다. local_exit이 주어지면 역시 생성자에 전달돼요. 그런 다음 인스턴스의 interact() 메서드를 bannerexitmsg를 배너·종료 메시지로 사용해 실행하고, 콘솔 객체는 사용 후 버려집니다.

버전 3.6 변경: exitmsg 매개변수가 추가되었어요. 버전 3.13 변경: local_exit 매개변수가 추가되었어요.

code.compile_command(source, filename='<input>', symbol='single')

Python 인터프리터의 메인 루프(a.k.a. 읽기-평가-출력 루프)를 흉내 내려는 프로그램에 유용한 함수예요. 까다로운 부분은 사용자가 입력한 것이 추가 입력으로 완성되는 불완전한 명령인지(완전한 명령이나 문법 오류와 반대의 경우) 판단하는 것이죠. 이 함수는 거의 항상 실제 인터프리터 메인 루프와 같은 결정을 내립니다.

source는 소스 문자열, filename은 소스가 읽힌 선택적 파일 이름(기본값 '<input>'), symbol은 선택적 문법 시작 심볼로 'single'(기본값), 'eval', 'exec' 중 하나예요.

명령이 완전하고 유효하면 코드 객체(compile(source, filename, symbol)과 동일)를, 불완전하면 None을 반환하고, 완전하지만 문법 오류가 있으면 SyntaxError를, 잘못된 리터럴이 있으면 OverflowErrorValueError를 일으킵니다.

인터랙티브 인터프리터 객체

InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')

인터프리터에서 소스를 컴파일하고 실행해요. 인자는 compile_command()와 같고, filename 기본값은 '<input>', symbol 기본값은 'single'이에요. 다음과 같은 일이 일어날 수 있습니다.

  • 입력이 잘못됨 — compile_command()가 예외를 일으킴(SyntaxError 또는 OverflowError). showsyntaxerror() 메서드로 문법 traceback을 출력하고, runsource()False를 반환해요.
  • 입력이 불완전해서 더 필요함 — compile_command()None을 반환. runsource()True를 반환해요.
  • 입력이 완전함 — compile_command()가 코드 객체를 반환. runcode()를 호출해 실행하며(런타임 예외는 SystemExit 제외하고 처리), runsource()False를 반환해요.

반환값으로 다음 줄에 sys.ps1을 쓸지 sys.ps2를 쓸지 결정할 수 있습니다.

InteractiveInterpreter.runcode(code)

코드 객체를 실행해요. 예외가 발생하면 showtraceback()을 호출해 traceback을 보여 줍니다. SystemExit은 전파되도록 두고, 그 외 모든 예외는 잡아요.

KeyboardInterrupt에 대한 참고: 이 예외는 이 코드의 다른 곳에서 발생할 수 있고 항상 잡히는 건 아니므로, 호출자가 처리할 준비를 해야 해요.

InteractiveInterpreter.showsyntaxerror(filename=None)

방금 발생한 문법 오류를 표시해요. 문법 오류에는 스택 traceback이 없으므로 표시하지 않아요. filename이 주어지면 Python 파서가 제공하는 기본 파일 이름 대신 예외에 넣는데, 파서는 문자열에서 읽을 때 항상 '<string>'을 쓰기 때문이에요. 출력은 write() 메서드로 작성됩니다.

InteractiveInterpreter.showtraceback()

방금 발생한 예외를 표시해요. 첫 번째 스택 항목은 인터프리터 객체 구현 내부에 있으므로 제거합니다. 출력은 write() 메서드로 작성됩니다.

버전 3.5 변경: 기본 traceback만이 아니라 전체 체인 traceback이 표시되도록 변경되었어요.

InteractiveInterpreter.write(data)

표준 오류 스트림(sys.stderr)에 문자열을 씁니다. 파생 클래스는 필요에 따라 적절한 출력 처리를 위해 이 메서드를 오버라이드해야 해요.

인터랙티브 콘솔 객체

InteractiveConsole 클래스는 InteractiveInterpreter의 서브클래스라서 인터프리터 객체의 모든 메서드에 더해 아래 추가 기능을 제공해요.

InteractiveConsole.interact(banner=None, exitmsg=None)

인터랙티브 Python 콘솔을 가깝게 모방해요. 선택적 banner 인자는 첫 상호작용 전에 출력할 배너를 지정해요. 기본값은 표준 Python 인터프리터가 출력하는 것과 유사한 배너 뒤에 콘솔 객체의 클래스 이름을 괄호로 붙여 출력합니다(실제 인터프리터와 헷갈리지 않도록 — 너무 비슷하니까요!).

선택적 exitmsg 인자는 종료할 때 출력할 종료 메시지를 지정해요. 빈 문자열을 넘기면 종료 메시지가 출력되지 않습니다. exitmsg를 주지 않거나 None이면 기본 메시지가 출력돼요.

버전 3.4 변경: 배너 출력을 없애려면 빈 문자열을 전달해야 해요. 버전 3.6 변경: 종료할 때 종료 메시지를 출력하도록 변경되었어요.

InteractiveConsole.push(line)

소스 텍스트 한 줄을 인터프리터에 밀어 넣어요. 줄에는 끝의 개행이 없어야 하고, 내부 개행은 있을 수 있어요. 줄은 버퍼에 추가되고, 버퍼의 이어 붙인 내용을 소스로 해서 인터프리터의 runsource() 메서드를 호출해요. 명령이 실행됐거나 유효하지 않다고 판단되면 버퍼는 재설정되고, 그렇지 않으면 명령이 불완전한 것이므로 버퍼는 줄이 추가된 그대로 남아요. 반환값은 더 많은 입력이 필요하면 True, 줄이 처리됐으면 False예요(runsource()와 동일).

InteractiveConsole.resetbuffer()

입력 버퍼에서 처리되지 않은 소스 텍스트를 제거해요.

InteractiveConsole.raw_input(prompt='')

프롬프트를 쓰고 한 줄을 읽어요. 반환된 줄에는 끝의 개행이 포함되지 않아요. 사용자가 EOF 키 시퀀스를 입력하면 EOFError가 발생합니다. 기본 구현은 sys.stdin에서 읽으며, 서브클래스는 다른 구현으로 바꿀 수 있어요.

더 알아보기