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

소스 코드: Lib/code.py

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

class code.InteractiveInterpreter(locals=None)

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

  Note that functions and classes objects created under an `InteractiveInterpreter` instance will belong to the namespace specified by locals. They are only pickleable if locals is the namespace of an existing module.

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

  대화형 파이썬 인터프리터의 동작을 가깝게 흉내 냅니다. 이 클래스는 `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)

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

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

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

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`에서 읽습니다; 서브 클래스는 이것을 다른 구현으로 바꿀 수 있습니다.