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
지시문의 이름은 지시문의 종류를 나타냅니다. 이 이름은 선택적인 atom이 올 수 있는지, 그리고 atom에 추가적인 구문적 또는 의미적 제약이 있는지를 정의합니다. 또한 지시문의 이름에 따라 지시문에 특정한 추가 구문적 또는 의미적 제약이 가해질 수 있습니다(예: 모듈 내 지시문의 위치가 모듈의 맨 위로 제한될 수 있습니다).
directive_statement에서 directive는 새로운 키워드입니다. PEP 5에 따라, 이 키워드는 처음에는 지시문에서 사용될 때만 키워드로 간주됩니다. 아래의 “하위 호환성”을 참조하십시오.
의미론
지시문은 Python 인터프리터에게 소스 파일을 다른 방식으로 처리하도록 지시합니다. 그 처리의 구체적인 세부 사항은 지시문 이름에 따라 달라집니다. 선택적인 atom은 일반적으로 소스 코드가 처리될 때 해석되며, 그 해석의 세부 사항은 지시문에 따라 달라집니다.
특정 지시문: transitional
호환되지 않는 구문적 또는 의미적 변경이 Python에 추가되는 경우, PEP 5는 새 기능을 처음에는 옛 기능과 함께 사용할 수 있게 하는 언어의 과도기적 진화를 의무화합니다. 이러한 과도기는 transitional 지시문을 통해 가능합니다.
transitional 지시문에서 NAME은 ‘transitional’입니다. atom은 반드시(MUST) 있어야 하며, 반드시(MUST) NAME이어야 합니다. 그 이름에 사용할 수 있는 값은 언어 변경이 정의될 때 정의됩니다. 그러한 지시문의 한 예는 다음과 같습니다:
directive transitional nested_scopes
transitional 지시문은 문서화 문자열을 제외하고 모듈의 다른 모든 문장보다 앞에 와야 합니다(MUST)(즉, 첫 번째 문장이 STRING+인 경우에만 모듈의 두 번째 문장으로 나타날 수 있습니다).
하위 호환성
directive를 새 키워드로 도입하면 기존 코드와 호환되지 않는 문제가 생길 수 있습니다. PEP 5의 지침에 따라, 이 명세의 초기 구현에서 directive는 유효한 directive_statement에서 사용된 경우(즉, 모듈에서 문자열이 아닌 첫 번째 토큰으로 나타난 경우)에만 새 키워드가 됩니다.
해결되지 않은 문제: 첫 번째 식별자로서의 directive
모듈에서 directive를 다음과 같이 사용하면:
directive = 1
(즉, directive라는 이름이 모듈의 맨 처음에 나타나면) 이를 식별자가 아닌 키워드로 취급합니다. 추가적인 미리 보기(look-ahead) 토큰을 사용하여 이를 NAME으로 분류할 수도 있겠지만, Python 토크나이저에서는 그러한 미리 보기를 사용할 수 없습니다.
질문과 답변
Q: 이 PEP는 소스 코드 문자 집합을 정의할 수 있도록 하려고 작성된 것처럼 보입니다. 정말 그렇습니까?
A: 아닙니다. directive 기능을 확장하여 소스 코드 인코딩을 지정할 수 있게 할 수는 있지만, 특정 지시문을 제안하지는 않습니다.
Q: 그렇다면 이 PEP는 도대체 왜 작성되었습니까?
A: 이 PEP는 import 문에 새로운 의미를 덧씌우자고 제안하는 PEP 236에 대한 대안 제안의 역할을 합니다. 이 PEP를 사용하면 더 일반적인 방식으로 문제를 해결할 수 있습니다.
Q: 하지만 소스 인코딩과 언어 변경을 섞는 것은 사과와 오렌지를 섞는 것과 같지 않습니까?
A: 그럴 수도 있습니다. 이 차이를 해결하기 위해 미리 정의된 “transitional” 지시문을 정의했습니다.
Copyright
This document has been placed in the public domain.