PEP 244 – directive 문
- Author:
- Martin von Löwis <martin at v.loewis.de>
- Status:
- Rejected
- Type:
- Standards Track
- Created:
- 20-Mar-2001
- Python-Version:
- 2.1
- Post-History:
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
동기
Python은 때때로 핵심 언어 구성체의 공표된 의미론에 호환되지 않는 변경을 가하거나, 그 우연적인(구현에 의존하는) 동작을 어떤 방식으로든 변경합니다. 이는 결코 변덕스럽게 이루어지는 것이 아니며 항상 장기적으로 언어를 개선하려는 목적으로 이루어지지만, 단기적으로는 논쟁의 여지가 있고 지장을 줍니다.
PEP 5인 “Guidelines for Language Evolution”은 이 고통을 완화하는 방법을 제안하며, 본 PEP는 이를 뒷받침하는 몇 가지 장치를 도입합니다.
PEP 227인 “Statically Nested Scopes”가 그 첫 번째 적용 사례이며, 여기서 예시로 사용될 것입니다.
잠재적으로 호환되지 않는 새로운 언어 기능이 추가될 때, 일부 모듈과 라이브러리는 이를 사용하기로 선택할 수 있는 반면, 다른 것들은 그렇지 않을 수 있습니다. 이 명세는 모듈 작성자가 특정 언어 기능이 해당 모듈에서 사용되는지 여부를 명시할 수 있는 구문을 도입합니다.
이 PEP에 대한 논의에서, 독자들은 “설정 가능한” 언어 기능에는 두 가지 종류가 있다고 언급했습니다:
- 결국에는 유일한 선택지가 되도록 설계된 것으로, 그 시점에는 사용을 명시할 필요가 더 이상 없어지는 것입니다. “Back to the
__future__”의 구문이 제안된 PEP 236인 “Back to the__future__”가 이 범주에 속하는 특성들입니다. 이 PEP는 이러한 기능들을 선언하는 것을 지원하며, 새로운 기능 하에서 의미론이 변경된 구성체의 “이전” 의미를 단계적으로 폐지하는 것을 지원합니다. 그러나 어떤 기능이 결국 단계적으로 폐지되어야 하는지에 대한 정책은 정의하지 않습니다. - 예를 들어 인터프리터의 어떤 기본 설정을 변경하는 경우처럼, 영구히 선택 사항으로 남도록 설계된 것입니다. 이러한 설정의 한 예로 특정 모듈에 대해 항상 줄 번호 명령을 내보내도록 요청하는 것을 들 수 있습니다. 이 명세에서는 그러한 종류의 특정 플래그를 제안하지 않습니다.
이 PEP의 주요 목표는 기존 라이브러리를 즉시 손상시키지 않으면서 새로운 언어 구성체를 지원하는 것이므로, 새로운 구문을 도입함으로써 기존 라이브러리가 손상되지 않도록 특별히 주의를 기울였습니다.
문법
directive_statement는 다음 형태의 문장입니다:
directive_statement: 'directive' ``NAME`` [atom] [';'] NEWLINE
directive의 이름은 directive의 종류를 나타냅니다. 이는 선택적 atom이 있을 수 있는지, 그리고 atom에 추가적인 구문적 또는 의미적 제약이 있는지를 정의합니다. 또한, directive의 이름에 따라 directive에 특정한 추가 구문적 또는 의미적 제약이 부과될 수 있습니다(예: 모듈 내 directive의 위치가 모듈 상단으로 제한될 수 있습니다).
directive_statement에서 directive는 새로운 키워드입니다. 이 키워드는 PEP 5에 따라 처음에는 지시문 문장에서 사용될 때만 키워드로 간주되며, 자세한 내용은 아래의 “하위 호환성”을 참조하십시오.
의미론
directive 문은 Python 인터프리터가 소스 파일을 다른 방식으로 처리하도록 지시합니다. 그 처리의 구체적인 세부 사항은 directive 이름에 따라 달라집니다. 선택적 atom은 일반적으로 소스 코드가 처리될 때 해석됩니다. 그 해석의 세부 사항은 directive에 따라 달라집니다.
특정 Directive: transitional
Python에 비호환적인 구문적 또는 의미적 변경이 추가되는 경우, PEP 5는 언어의 과도기적 진화를 규정하며, 이 과정에서 새 기능은 처음에는 기존 기능과 함께 사용할 수 있습니다. 이러한 전환은 transitional directive를 통해 가능합니다.
transitional directive에서 NAME은 ‘transitional’입니다. atom은 반드시 존재해야 하며, 반드시 NAME이어야 합니다. 그 이름에 대해 가능한 값들은 언어 변경이 정의될 때 함께 정의됩니다. 그러한 directive의 한 가지 예는 다음과 같습니다:
directive transitional nested_scopes
전환용 directive는 문서화 문자열을 제외하고 모듈 내 다른 어떤 문장보다도 앞에 와야 합니다(즉, 첫 번째 문장이 STRING+인 경우에만 모듈의 두 번째 문장으로 나타날 수 있습니다).
하위 호환성
directive를 새로운 키워드로 도입하면 기존 코드와의 비호환성이 발생할 수 있습니다. 이 명세의 초기 구현에서는 PEP 5의 지침에 따라, directive는 유효한 directive_statement에서 사용된 경우—즉 모듈에서 첫 번째 비문자열 토큰으로 나타난 경우—에만 새로운 키워드가 됩니다.
해결되지 않은 문제: 첫 번째 식별자로서의 directive
모듈에서 directive를 다음과 같이 사용하면:
directive = 1
(즉, 이름 directive가 모듈에서 가장 먼저 나타나면) 이는 식별자가 아니라 키워드로 취급됩니다. 추가적인 선행 참조(look-ahead) 토큰을 사용하여 이를 NAME으로 분류하는 것도 가능하겠지만, 그러한 선행 참조는 파이썬 토크나이저에서 사용할 수 없습니다.
질문과 답변
Q: 이 PEP는 소스 코드 문자 집합의 정의를 허용하기 위해 작성된 것처럼 보입니다. 그것이 사실입니까?
A: 아닙니다. directive 기능을 확장하여 소스 코드 인코딩을 허용할 수 있지만, 특정 directive가 제안되는 것은 아닙니다.
Q: 그렇다면 이 PEP는 왜 작성된 것입니까?
A: 이는 import 문에 새로운 의미를 덧씌우자고 제안하는 PEP 236에 대한 대안으로 작용합니다. 이 PEP는 문제를 더 일반적인 방식으로 해결할 수 있게 합니다.
Q: 하지만 소스 인코딩과 언어 변경을 섞는 것은 사과와 오렌지를 섞는 것과 같지 않습니까?
A: 아마도 그럴 것입니다. 이 차이를 해결하기 위해 미리 정의된 “transitional” 지시어가 정의되었습니다.
Copyright
This document has been placed in the public domain.