"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.ps1"과
   "sys.ps2"를 사용하는 프롬프트와 입력 버퍼링을 추가합니다.

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

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

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