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

소스 코드: Lib/code.py

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

class code.InteractiveInterpreter(locals=None)

  This class deals with parsing and interpreter state (the user’s namespace); it does not deal with input buffering or prompting or input file naming (the filename is always passed in explicitly). The optional locals argument specifies the dictionary in which code will be executed; it defaults to a newly created dictionary with key `'__name__'` set to `'__console__'` and key `'__doc__'` set to `None`.

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

  Closely emulate the behavior of the interactive Python interpreter. This class builds on `InteractiveInterpreter` and adds prompting using the familiar `sys.ps1` and `sys.ps2`, and input buffering.

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

  Convenience function to run a read-eval-print loop. This creates a new instance of `InteractiveConsole` and sets readfunc to be used as the `InteractiveConsole.raw_input()` method, if provided. If local is provided, it is passed to the `InteractiveConsole` constructor for use as the default namespace for the interpreter loop. The `interact()` method of the instance is then run with banner and exitmsg passed as the banner and exit message to use, if provided. The console object is discarded after use.

  버전 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`를 발생시키고, 명령에 유효하지 않은 리터럴이 포함되었으면 `OverflowError`나 `ValueError`를 발생시킵니다.

## 대화형 인터프리터 객체

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

  인터프리터에서 소스를 컴파일하고 실행합니다. 인자는 `compile_command()`와 같습니다; filename의 기본값은 `'<input>'`이고, symbol의 기본값은 `'single'`입니다. 여러 가지 중 하나가 발생할 수 있습니다:

  - 입력이 잘못되었습니다; `compile_command()`가 예외(`SyntaxError`나 `OverflowError`)를 발생시켰습니다. 문법 트레이스백이 `showsyntaxerror()` 메서드를 호출하여 인쇄됩니다. `runsource()`는 `False`를 반환합니다.

  - 입력이 불완전하고, 더 많은 입력이 필요합니다; `compile_command()`가 `None`을 반환했습니다. `runsource()`는 `True`를 반환합니다.

  - 입력이 완전합니다; `compile_command()`가 코드 객체를 반환했습니다. 코드는 `runcode()`(`SystemExit`를 제외한 실행 시간 예외도 처리합니다)를 호출하여 실행됩니다. `runsource()`는 `False`를 반환합니다.

  반환 값은 다음 줄의 프롬프트에 `sys.ps1`과 `sys.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)

  소스 텍스트 줄을 인터프리터로 밀어 넣습니다. line에는 후행 줄 바꿈이 없어야 합니다; 내부 줄 바꿈은 있을 수 있습니다. 줄은 버퍼에 추가되고 인터프리터의 `runsource()` 메서드가 이어붙인 버퍼의 내용을 소스로 하여 호출됩니다. 이것이 명령이 실행되었거나 유효하지 않았다고 알리면 버퍼는 재설정됩니다; 그렇지 않고 명령이 불완전하다면, 버퍼는 줄을 추가한 상태로 유지됩니다. 반환 값은 추가 입력이 필요하면 `True`이고, 어떤 식으로든 줄이 처리되었으면 `False`입니다 (`runsource()`와 같습니다).

InteractiveConsole.resetbuffer()

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

InteractiveConsole.raw_input(prompt='')

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