code — 인터프리터 기본 클래스
code — 인터프리터 기본 클래스
(소스: Lib/code.py)
code 모듈은 파이썬에서 read-eval-print 루프(REPL)를 구현하기 위한 기능을 제공해요. 대화형 인터프리터 프롬프트를 제공하는 애플리케이션을 만드는 데 쓸 수 있는 두 클래스와 편의 함수가 포함돼 있어요.
본문
class code.InteractiveInterpreter(locals=None)
이 클래스는 파싱과 인터프리터 상태(사용자 네임스페이스)를 다뤄요. 입력 버퍼링·프롬프팅·입력 파일 이름은 다루지 않아요(파일 이름은 항상 명시적으로 전달). 선택적 locals 인자는 코드가 실행될 네임스페이스로 쓸 매핑을 지정해요. 기본은 키 '__name__'이 '__console__'이고 키 '__doc__'이 None인 새로 만든 사전이에요. InteractiveInterpreter 인스턴스 아래에서 만든 함수·클래스 객체는 locals가 지정한 네임스페이스에 속해요. locals가 기존 모듈의 네임스페이스일 때만 pickle할 수 있어요.
class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)
대화형 파이썬 인터프리터의 동작을 밀접하게 에뮬레이션해요. InteractiveInterpreter 위에 sys.ps1과 sys.ps2를 사용하는 프롬프팅과 입력 버퍼링을 추가해요. local_exit이 true면 콘솔에서 exit()과 quit()이 SystemExit을 발생시키지 않고 호출 코드로 돌아가요. (3.13에서 local_exit 추가)
함수
code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False): read-eval-print 루프를 실행하는 편의 함수.InteractiveConsole의 새 인스턴스를 만들고, 제공되면readfunc를InteractiveConsole.raw_input()메서드로 사용하도록 설정해요.local이 제공되면InteractiveConsole생성자에 넘겨 인터프리터 루프의 기본 네임스페이스로 써요.interact()메서드를 banner와 exitmsg를 사용해 실행하고, 콘솔 객체는 사용 후 버려져요. (3.6에서 exitmsg, 3.13에서 local_exit 추가)code.compile_command(source, filename='<input>', symbol='single'): 파이썬 인터프리터 메인 루프(read-eval-print 루프)를 에뮬레이션하려는 프로그램에 유용한 함수예요. 까다로운 부분은 사용자가 더 입력하면 완성될 수 있는 불완전한 명령(완전한 명령이나 문법 오류와 대조)을 언제 입력했는지 결정하는 거예요. 이 함수는 거의 항상 실제 인터프리터 메인 루프와 같은 결정을 내려요.source는 소스 문자열,filename은 source를 읽은 선택적 파일 이름(기본 ''),symbol은 문법 시작 기호로 'single'(기본), 'eval' 또는 'exec'이어야 해요. 명령이 완전하고 유효하면 코드 객체(compile(source, filename, symbol)과 동일)를, 불완전하면 None을, 완전하지만 문법 오류를 포함하면SyntaxError를, 잘못된 리터럴을 포함하면OverflowError또는ValueError를 발생시켜요.
대화형 인터프리터 객체
-
InteractiveInterpreter.runsource(source, filename='<input>', symbol='single'): 일부 소스를 인터프리터에서 컴파일·실행. 인자는compile_command()와 동일. 다음 중 하나가 일어나요:- 입력이 잘못됨:
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를 제외한 모든 예외가 잡혀요(SystemExit는 전파되도록 허용).KeyboardInterrupt참고: 이 예외는 이 코드의 다른 곳에서 발생할 수 있고 항상 잡히지는 않아요. 호출자는 처리할 준비가 되어야 해요. -
InteractiveInterpreter.showsyntaxerror(filename=None): 방금 발생한 문법 오류 표시. 문법 오류엔 스택 trace가 없으므로 표시하지 않아요. filename이 주어지면 파이썬 파서가 기본으로 제공하는 파일 이름 대신 그걸 예외에 넣어요(문자열에서 읽을 때 항상 ''을 쓰기 때문). 출력은 write()메서드로 작성돼요. -
InteractiveInterpreter.showtraceback(): 방금 발생한 예외 표시. 첫 스택 항목은 인터프리터 객체 구현 내부이므로 제거해요. 출력은write()로 작성. (3.5부터 기본 traceback뿐 아니라 전체 연결된 traceback 표시) -
InteractiveInterpreter.write(data): 문자열을 표준 오류 스트림(sys.stderr)에 써요. 파생 클래스는 필요에 따라 적절한 출력 처리를 위해 이걸 오버라이드해야 해요.
대화형 콘솔 객체
InteractiveConsole 클래스는 InteractiveInterpreter의 서브클래스라 인터프리터 객체의 모든 메서드에 더해 다음을 제공해요.
InteractiveConsole.interact(banner=None, exitmsg=None): 대화형 파이썬 콘솔을 밀접하게 에뮬레이션. 선택적 banner는 첫 상호작용 전에 출력할 배너(기본은 표준 파이썬 인터프리터가 출력하는 것과 비슷한 배너에 콘솔 객체의 클래스 이름을 괄호로 붙인 것 — 진짜 인터프리터와 혼동하지 않도록, 너무 비슷하니까!). 선택적 exitmsg는 종료 시 출력될 메시지. 빈 문자열을 넘기면 종료 메시지를 생략. exitmsg가 주어지지 않거나 None이면 기본 메시지 출력. (3.4부터 배너 생략은 빈 문자열, 3.6부터 종료 메시지 출력)InteractiveConsole.push(line): 소스 텍스트 줄을 인터프리터에 밀어 넣어요. 줄에 끝 개행은 없어야 하고 내부 개행은 있을 수 있어요. 줄이 버퍼에 추가되고 버퍼의 연결된 내용을 소스로runsource()를 호출해요. 명령이 실행됐거나 유효하지 않다는 표시면 버퍼가 재설정되고, 불완전하면 줄이 추가된 후 버퍼가 그대로 남아요. 반환값은 더 입력이 필요하면 True, 줄이 어떤 방식으로든 처리됐으면 False(runsource()와 동일).InteractiveConsole.resetbuffer(): 입력 버퍼에서 처리되지 않은 소스 텍스트를 제거.InteractiveConsole.raw_input(prompt=''): 프롬프트를 쓰고 줄을 읽어요. 반환된 줄은 끝 개행을 포함하지 않아요. 사용자가 EOF 키 시퀀스를 입력하면EOFError발생. 기본 구현은sys.stdin에서 읽고, 서브클래스는 다른 구현으로 바꿀 수 있어요.