code — 인터프리터 베이스 클래스

소스 코드: Lib/code.py


code 모듈은 파이썬에서 REPL(read-eval-print loop)을 구현하는 기능을 제공합니다. 대화형 인터프리터 프롬프트를 제공하는 응용 프로그램을 만드는 데 사용할 수 있는 두 개의 클래스와 편리 함수들이 포함되어 있습니다.

class code.InteractiveInterpreter(locals=None)

이 클래스는 구문 분석과 인터프리터 상태(사용자의 이름 공간)를 처리합니다; 입력 버퍼링이나 프롬프트 또는 입력 파일 이름 지정을 처리하지 않습니다 (파일명은 항상 명시적으로 전달됩니다). 선택적 locals 인자는 코드가 실행될 딕셔너리를 지정합니다; 기본값은 키 '__name__''__console__'로 설정되고 키 '__doc__'None으로 설정된 새로 만들어진 딕셔너리입니다.

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

대화형 파이썬 인터프리터의 동작을 가깝게 흉내 냅니다. 이 클래스는 InteractiveInterpreter를 기반으로 하며 친숙한 sys.ps1sys.ps2를 사용하는 프롬프트와 입력 버퍼링을 추가합니다.

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

REPL(read-eval-print loop)를 실행하는 편리 함수. 이것은 InteractiveConsole의 새 인스턴스를 만들고, 제공된다면 readfuncInteractiveConsole.raw_input() 메서드로 사용되도록 설정합니다. local이 제공되면 인터프리터 루프의 기본 이름 공간으로 사용하기 위해 InteractiveConsole 생성자로 전달됩니다. 그런 다음 인스턴스의 interact() 메서드를 실행하는데, 제공된다면 bannerexitmsg를 각각 배너와 종료 메시지로 사용하도록 전달합니다. 콘솔 객체는 사용 후에 폐기됩니다.

버전 3.6에서 변경: exitmsg 매개 변수가 추가되었습니다.

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

이 함수는 파이썬의 인터프리터 메인 루프(소위 REPL)를 흉내 내고 싶은 프로그램에 유용합니다. 까다로운 부분은 사용자가 후에 추가의 텍스트를 입력해서 완성할 수 있는 불완전한 명령을 입력했는지를 결정하는 것입니다 (완전한 명령이나 문법 에러가 아니라). 이 함수는 거의 항상 실제 인터프리터 메인 루프와 같은 결정을 내립니다.

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'입니다. 여러 가지 중 하나가 발생할 수 있습니다:

반환 값은 다음 줄의 프롬프트에 sys.ps1sys.ps2 중 어느 것을 사용할지 결정하는 데 사용될 수 있습니다.

InteractiveInterpreter.runcode(code)

코드 객체를 실행합니다. 예외가 발생하면, showtraceback()가 호출되어 트레이스백을 표시합니다. 전파가 허락된 SystemExit를 제외한 모든 예외를 잡습니다.

KeyboardInterrupt에 대한 노트: 이 예외는 이 코드의 어딘가에서 발생할 수 있으며, 항상 잡히지는 않습니다. 호출자는 이것을 처리할 준비가 되어 있어야 합니다.

InteractiveInterpreter.showsyntaxerror(filename=None)

방금 발생한 문법 에러를 표시합니다. 스택 트레이스는 표시하지 않습니다, 문법 에러에는 그런 것이 없기 때문입니다. filename이 주어지면, 파이썬 구문 분석기가 제공하는 기본 파일명 대신에 예외에 채워집니다, 문자열에서 읽을 때는 항상 '<string>'을 사용하기 때문입니다. 출력은 write() 메서드로 기록됩니다.

InteractiveInterpreter.showtraceback()

방금 발생한 예외를 표시합니다. 첫 번째 스택 항목을 제거합니다, 그것은 인터프리터 객체 구현에 속하기 때문입니다. 출력은 write() 메서드로 기록됩니다.

버전 3.5에서 변경: 단지 기본(primary) 트레이스백이 아니라 전체 연결된(chained) 트레이스백이 표시됩니다.

InteractiveInterpreter.write(data)

문자열을 표준 에러 스트림(sys.stderr)에 기록합니다. 파생 클래스는 필요에 따라 적절한 출력 처리를 제공하기 위해 이것을 재정의해야 합니다.

대화형 콘솔 객체

InteractiveConsole 클래스는 InteractiveInterpreter의 서브 클래스이므로, 인터프리터 객체의 모든 메서드와 다음과 같은 추가 메서드를 제공합니다.

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

대화형 파이썬 콘솔을 가깝게 흉내 냅니다. 선택적 banner 인자는 첫 번째 상호 작용 전에 인쇄할 배너를 지정합니다; 기본적으로 표준 파이썬 인터프리터가 출력하는 것과 비슷한 배너를 출력한 다음 괄호 안에 콘솔 객체의 클래스 이름을 출력합니다 (실제 인터프리터와 혼동하지 않도록 하기 위함입니다 – 너무 비슷합니다!).

선택적 exitmsg 인자는 종료할 때 인쇄되는 종료 메시지를 지정합니다. 종료 메시지를 표시하지 않으려면 빈 문자열을 전달하십시오. exitmsg가 주어지지 않았거나 None이면, 기본 메시지가 인쇄됩니다.

버전 3.4에서 변경: 배너 인쇄를 억제하려면, 빈 문자열을 전달하십시오.

버전 3.6에서 변경: 종료할 때 종료 메시지를 인쇄합니다.

InteractiveConsole.push(line)

Push a line of source text to the interpreter. The line should not have a trailing newline; it may have internal newlines. The line is appended to a buffer and the interpreter’s runsource() method is called with the concatenated contents of the buffer as source. If this indicates that the command was executed or invalid, the buffer is reset; otherwise, the command is incomplete, and the buffer is left as it was after the line was appended. The return value is True if more input is required, False if the line was dealt with in some way (this is the same as runsource()).

InteractiveConsole.resetbuffer()

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

InteractiveConsole.raw_input(prompt='')

프롬프트를 기록하고 줄을 읽습니다. 반환된 줄에는 후행 줄 바꿈이 포함되지 않습니다. 사용자가 EOF 키 시퀀스를 입력하면, EOFError가 발생합니다. 기본 구현은 sys.stdin에서 읽습니다; 서브 클래스는 이것을 다른 구현으로 바꿀 수 있습니다.