Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 264 – 시뮬레이션된 셸에서의 Future 문

Author:
Michael Hudson <mwh at python.net>
Status:
Final
Type:
Standards Track
Requires:
236
Created:
30-Jul-2001
Python-Version:
2.2
Post-History:
30-Jul-2001

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

언급된 바와 같이, PEP 236에서는 “시뮬레이션된 대화형 셸”이 “실제” 대화형 셸에서 __future__ 문의 동작을 시뮬레이션하여, 다시 말해 __future__ 문에 따른 효과가 셸의 수명 동안 지속되게 할 명확한 방법은 없습니다.

이 PEP는 또한 PEP 236에서 언급된 해결되지 않은 다른 문제, 즉 compile()을 호출하는 코드에 영향을 주는 Future 문의 효과를 compile()이 상속하지 않도록 막을 수 없는 문제를 해결할 기회를 제공합니다.

이 PEP는 내장 함수 “compile”에 선택적인 네 번째 인자를 추가하고, __future__.py에 정의된 _Feature인스턴스에 정보를 추가하며, 이러한 셸을 쉽게 구성할 수 있도록 표준 라이브러리 모듈 “codeop”과 “code”에 기능을 추가하여 첫 번째 문제를 해결할 것을 제안합니다.

두 번째 문제는 compile()또 다른 선택적 인자를 간단히 추가하여 처리합니다. 이 인자가 0이 아니면 Future 문의 효과가 상속되지 않습니다.

사양

내장 함수 “compile”에 네 번째 선택적 “flags” 인자를 추가할 것을 제안합니다. 이 인자를 생략하면 Python 2.1의 동작과 달라지는 점이 없습니다.

이 인자가 지정되면 다양한 가능한 컴파일 시간 옵션을 비트 필드로 나타내는 정수일 것으로 예상합니다. 비트 필드는 Future 문을 가리키기 위해 Python 인터프리터의 C 부분에서 이미 사용하는 CO_* 플래그와 동일한 값을 갖습니다.

compile()은 제공된 플래그에 설정된 비트 중 인식하지 못하는 비트가 있으면 ValueError예외를 발생시켜야 합니다.

제공된 플래그는 별도로 설정될 플래그와 비트별 “or” 연산되지만, 새로운 다섯 번째 선택적 인자가 0이 아닌 정수이면 제공된 플래그만 정확히 사용되는 집합이 됩니다.

위에서 언급한 플래그는 현재 Python에 노출되어 있지 않습니다. 필요한 비트를 포함하는 __future__.py_Feature객체에 .compiler_flag속성을 추가하여 다음과 같은 코드를 작성할 수 있도록 할 것을 제안합니다.:

import __future__
def compile_generator(func_def):
    return compile(func_def, "<input>", "suite",
                __future__.generators.compiler_flag)

최근 변경 사항으로 인해 동일한 비트를 사용하여 코드 객체가 특정 기능을 사용해 컴파일되었는지 확인할 수 있습니다. 예를 들어

codeob.co_flags & __future__.generators.compiler_flag``

코드 객체 “codeob”가 제너레이터가 허용된 환경에서 컴파일된 경우에만 0이 아닌 값이 됩니다.

또한 실행 중인 인터프리터가 지원하는 모든 __future__ 옵션을 간단히 열거할 수 있도록 __future__ 모듈에 .all_feature_flags속성을 추가하겠습니다.

또한 표준 라이브러리 모듈 codeop에 한 쌍의 클래스를 추가할 것을 제안합니다.

그중 하나인 Compile__call__메서드를 제공하며, __future__ 문을 컴파일한 후 해당 문을 “기억”하고 이후의 모든 코드를 해당 __future__ 옵션이 적용된 상태로 컴파일한다는 점을 제외하면 2.1의 내장 “compile”과 거의 동일하게 동작합니다.

이는 위에서 언급한 __future__ 모듈의 새로운 기능을 사용하여 수행합니다.

codeop에 추가되는 다른 클래스인 CommandCompiler의 객체는 기존 codeop.compile_command함수의 역할을 수행하지만, __future__를 인식하는 방식으로 동작합니다.

마지막으로 표준 라이브러리 모듈 code의 InteractiveInterpreter클래스를 수정하여 CommandCompiler를 사용하게 함으로써 기본 Python 셸의 동작을 더욱 가깝게 모방할 것을 제안합니다.

하위 호환성

변경 사항은 매우 적거나 전혀 없을 것입니다. compile에 대한 변경은 기존 코드에 아무런 차이를 만들지 않으며, codeop에 새 함수나 클래스를 추가하는 것도 마찬가지입니다. code.InteractiveInterpreter를 사용하는 기존 코드는 동작이 변경될 수 있지만, “실제” Python 셸을 더 잘 모방하게 된다는 점에서 개선되는 경우에만 변경됩니다.

상위 호환성

__future__기능을 추가할 때 Lib/__future__.py에 수행해야 하는 수정 작업이 약간 더 복잡해집니다. 그 밖의 모든 것은 그대로 작동해야 합니다.

문제

위 인터페이스를 Jython에 구현하는 일이 지나치게 방해가 되지 않기를 바랍니다.

구현

일련의 예비 구현이 [1]에 있습니다.

Tim Peters가 가볍게 손질한 후, 이제 반영되었습니다.

참고 문헌