codeop — Python 코드 컴파일
codeop — Python 코드 컴파일
codeop 모듈은 code 모듈에서처럼 Python 읽기-평가-출력 루프를 흉내 낼 수 있는 유틸리티를 제공해요. 그래서 이 모듈을 직접 쓸 일은 별로 없고, 프로그램에 그런 루프를 넣으려면 아마 code 모듈을 쓰는 게 나아요.
출처: Python 표준 라이브러리
본문
이 작업은 두 부분으로 나눌 수 있어요.
- 입력 한 줄이 Python 문장을 완성하는지 판단하는 것 — 간단히 말해 다음에
>>>를 출력할지...를 출력할지 결정하는 일이에요. - 사용자가 입력한
__future__문장을 기억해 두었다가, 이후 입력을 그 효과가 적용된 상태로 컴파일하는 것.
codeop 모듈은 각각을 처리하는 방법과, 둘 다 처리하는 방법을 제공합니다.
앞쪽만 처리하려면:
codeop.compile_command(source, filename='<input>', symbol='single') — source(Python 코드 문자열)를 컴파일하려 시도하고, source가 유효한 Python 코드면 코드 객체를 반환해요. 그 경우 코드 객체의 filename 속성은 기본값이 '<input>'인 filename이 됩니다. source가 유효한 Python 코드는 아니지만 유효한 Python 코드의 접두사면 None을 반환해요.
source에 문제가 있으면 예외가 발생합니다. 잘못된 Python 문법이면 SyntaxError, 잘못된 리터럴이면 OverflowError나 ValueError가 발생해요.
symbol 인자는 source를 문장('single', 기본값)으로 컴파일할지, 문장 시퀀스('exec')로 할지, 표현식('eval')으로 할지 결정해요. 다른 값이면 ValueError가 발생합니다.
참고: 파서가 소스 끝에 도달하기 전에 성공적으로 파싱을 멈출 가능성이 있는데(드물지만), 이 경우 뒤쪽 심볼은 오류를 일으키는 대신 무시될 수 있어요. 예를 들어 백슬래시 다음에 두 개의 개행이 오고 그다음 임의의 쓰레기가 올 수 있어요. 파서 API가 더 좋아지면 수정될 예정입니다.
class codeop.Compile — 이 클래스의 인스턴스는 내장 함수 compile()과 시그니처가 동일한 __call__() 메서드를 가지지만, 차이점은 인스턴스가 __future__ 문장을 포함한 프로그램 텍스트를 컴파일하면 그 문장을 '기억'하고 이후 모든 프로그램 텍스트를 그 문장이 적용된 상태로 컴파일한다는 거예요.
class codeop.CommandCompiler — 이 클래스의 인스턴스는 compile_command()와 시그니처가 동일한 __call__() 메서드를 가지며, Compile과 같은 방식으로 __future__ 문장을 기억·적용합니다.