PEP 641 – Python 3.10 호환성 태그의 버전 부분에 밑줄 사용하기
- Author:
- Brett Cannon <brett at python.org>, Steve Dower <steve.dower at python.org>, Barry Warsaw <barry at python.org>
- PEP-Delegate:
- Pablo Galindo Salgado <pablogsal at python.org>
- Discussions-To:
- Discourse thread
- Status:
- Rejected
- Type:
- Standards Track
- Created:
- 20-Oct-2020
- Python-Version:
- 3.10
- Post-History:
- 21-Oct-2020
- Resolution:
- Discourse message
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
Note
이 PEP는 커뮤니티에서 기존 도구가 깨질 가능성 때문에 거부되었습니다.
PEP 425에 설명된 태그 시스템(주로 wheel 파일 이름에 사용됨)에 따라 Python의 각 릴리스는 호환성 태그(예: CPython 3.9의 경우 cp39, py39)를 지정합니다. 이 PEP는 CPython 3.10의 태그 버전 부분으로 (310 대신) 3_10을 사용할 것을 제안합니다.
동기
지금까지 wheel 파일 이름 등에 사용되는 호환성 태그의 버전 부분은 CPython 인터프리터 태그와 인터프리터에 구애받지 않는 범용 인터프리터 태그(예: 각각 cp39와 py39) 모두에서 Python의 메이저 버전과 마이너 버전을 그대로 이어 붙인 것이었습니다. 이는 ABI 태그(예: cp39)에도 마찬가지로 적용됩니다. 주 버전과 부 버전이 모두 한 자리 숫자였기 때문에, 예를 들어 39에서 각 숫자가 무엇을 나타내는지 모호하지 않았습니다.
그러나 Python 3.10부터는 310이 Python 버전이 3.10인지, 31.0인지, 아니면 메이저 버전만으로 이루어진 Python 310인지를 명확하게 구분하지 못하므로 모호성이 생깁니다. 따라서 PEP 425에서 허용하는 대로 3_10을 사용하여 메이저/마이너 부분을 구분하면 지원 대상 Python 버전의 모호성이 해소됩니다.
근거
제안된 다른 구분자 대신 3_10을 사용하는 것은 PEP 425의 제약 때문이며, 따라서 선택지는 3_10 또는 310뿐입니다.
명세
SOABI configure 변수와 sysconfig.get_config_var('py_version_nodot')는 3_10을 적절히 사용하도록 갱신됩니다.
하위 호환성
‘packaging’(패키징) 프로젝트 [2]에 의존하는 도구들은 이미 Python 3.10의 버전 명세로 3_10을 기대합니다. 버전 지정자를 310으로 유지하려면 그 변경을 되돌리고 이에 의존하는 프로젝트(예: pip)를 갱신해야 합니다.
3_10으로 전환하면 부 버전이 한 자리 숫자라는 관례에 암묵적으로 의존하는 모든 도구가 영향을 받습니다. 그러나 이러한 도구들은 여기서의 변경 여부와 관계없이 어차피 제대로 동작하지 않습니다.
메이저 버전이 첫 번째 숫자뿐이라고 가정하는 도구는 3_10으로 전환할 경우 업데이트가 필요합니다.
로케일을 적용하지 않은 ASCII에서 _는 모든 숫자보다 뒤에 정렬되므로, wheel 파일 이름의 사전식 정렬이 Python 버전순 정렬과 일치하는 성질은 유지됩니다.
PEP 515(Python 3.6) 이후로 숫자 리터럴 안의 밑줄은 무시됩니다. 즉, int("3_10")과 int("310")은 같은 결과를 내므로 정수 변환에 기반한 정렬 순서도 유지됩니다. 그러나 이는 여전히 태그를 정렬하는 좋지 않은 방법이며, 여기서 이 점을 언급하는 것은 단지 이 제안이 상황을 더 나쁘게 만들지 않는다는 것을 보여 주기 위해서입니다.
보안 영향
알려진 보안 문제는 없습니다.
교육 방법
인터프리터 태그는 주로 기계가 사용하며 이 PEP가 모호성을 해소하므로, 교육 측면에서 특별히 고려해야 할 사항은 없습니다.
참조 구현
CPython 3.10에 지원을 추가하는 풀 리퀘스트 [1]가 이미 존재합니다. 이 PEP 제안에 따른 wheel 파일을 읽는 기능은 이미 구현되어 있습니다.
기각된 아이디어
변경하지 않는 방안
태그를 변경하지 않고 310을 그대로 유지하는 방안도 검토되었습니다. 그 근거가 된 인자는 작업량이 적고 기존 도구를 망가뜨리지 않는다는 것이었습니다. 그러나 결국 모호성을 해소하는 편이 더 낫다고 판단되었습니다.
미해결 문제
이 변경을 어디까지 적용해야 합니까?
주 버전과 부 버전이 사용되는 다른 곳들도 밑줄을 사용하도록 갱신할 수 있습니다(예: .pyc 파일, 표준 라이브러리 zip 파일의 임포트 경로). 이를 전반적으로 적용하는 것이 얼마나 유용할지는 알려져 있지 않습니다.
부 버전 번호를 두 자리로 표준화하는 방안
부 버전을 항상 두 자리로 강제하고 필요에 따라 0으로 채워서, 주 버전과 부 버전이 시작하고 끝나는 지점을 명확히 구분하자는 대안이 제시되었습니다. 이 방안의 장점은 현재의 cp310 인터프리터 태그를 정확한 것으로 만들어 호환성이 깨지는 일을 최소화한다는 점입니다. 또한 앞으로의 버전도 구분할 수 있게 해 줍니다.
하지만 몇 가지 단점이 있습니다. 하나는 부 버전 번호가 두 자리라는 사실을 알고 있을 때만 모호성이 해소된다는 점입니다. 사전 지식과 관계없이 모호하지 않은 cp3_10과 비교해 보십시오. 또한 이 두 자리 요구 사항으로는 부 버전 번호가 세 자리가 될 가능성에 대처할 수 없습니다.
다른 인터프리터들이 과거, 현재 또는 미래에 이 관행을 따르지 않는다는 문제도 있습니다. 예를 들어, 다른 사람들이 이전에 다른 인터프리터에서 인터프리터 태그의 버전 부분을 세 자리로 사용한 적이 있어서 이 규칙이 맞지 않게 되는 경우가 있는지 알 수 없습니다. 또한 이 변경은 현재 부 버전이 한 자리인 인터프리터(예: PyPy 7.3)가 pp73에서 pp703으로 바꾸거나, 다음 부 릴리스(예: 7.4 또는 8.0)부터 전환해야 함을 뜻하게 됩니다. 그렇지 않으면 이 규칙이 cp 인터프리터 유형에만 적용되어 사람들에게 더 큰 혼란을 주게 됩니다.
참고 문헌
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.