PEP 313 – Python에 로마 숫자 리터럴 추가하기
- Author:
- Mike Meyer <mwm at mired.org>
- Status:
- Rejected
- Type:
- Standards Track
- Created:
- 01-Apr-2003
- Python-Version:
- 2.4
- Post-History:
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP(PEP CCCXIII라고도 합니다)는 로마 숫자를 리터럴 타입으로 추가할 것을 제안합니다. 또한 새로운 내장 함수 “roman”을 제안합니다. 이 함수는 객체를 정수로 변환한 다음, 그 정수를 같은 값의 로마 숫자 리터럴 문자열로 변환합니다.
BDFL 선언
이 PEP는 거부되었습니다. 대다수의 Python 사용자는 이것이 있으면 좋은 기능이라고 여겼지만, 커뮤니티는 9를 현대식 표기인 IX로 나타낼지, 고전식 표기인 VIIII로 나타낼지에 대해 합의에 이르지 못했습니다. 마찬가지로, MXM과 MCMXC 중 어느 것을 1990의 올바른 표기로 볼지에 대해서도 합의가 이루어지지 않았습니다. 또한 목소리 큰 소수의 사용자들이 (i) 파워포인트 슬라이드, (ii) 학술 작업, (iii) Perl 문서에 사용할 수 있도록 소문자 숫자 지원을 요청했습니다.
근거
로마 숫자는 여러 분야에서 사용되며, 이를 Python에 리터럴로 추가하면 해당 분야의 계산이 더 쉬워질 것입니다. 예를 들어, 슈퍼볼은 로마 숫자로 회차를 세며, 오래된 영화 중 상당수는 저작권 연도를 로마 숫자로 표기합니다. 더욱이 LISP는 로마 숫자 리터럴 패키지를 제공하므로, Python에 로마 숫자를 추가하면 comp.lang.python에서 가끔 보이는 LISP에 대한 부러움을 달래는 데 도움이 될 것입니다. 게다가 저자는 이것이 PEP에 자기 이름을 올리는 가장 쉬운 방법이라고 생각합니다.
로마 숫자 리터럴 문법
로마 숫자 리터럴은 M, D, C, L, X, V, I 문자로만 구성됩니다. 리터럴은 반드시 대문자여야 하며, 다음 규칙에 따라 정수를 나타냅니다:
- 아래에 명시된 경우를 제외하고, 문자는 M, D, C, L, X, V, I 순서로 나타나야 합니다. 각 문자는 나타날 때마다 리터럴의 값에 각각 1000, 500, 100, 50, 10, 5, 1을 더합니다.
- 하나의 리터럴에는 D, V, L이 각각 하나씩만 나타날 수 있습니다.
- 하나의 리터럴에서 I, X, C는 각각 최대 세 번까지만 연속으로 나타날 수 있습니다.
- I 하나가 단 하나뿐인 V의 바로 왼쪽에 나타날 수 있으며, 이때 V 뒤에는 I가 오지 않아야 하고, 리터럴의 값에 4를 더합니다.
- 마찬가지로 I 하나가 마지막 X 앞에 나타날 수 있으며, 이때 X 뒤에는 I나 V가 오지 않아야 하고, 값에 9를 더합니다.
- X와 L, C의 관계는 I와 V, X의 관계와 같으며, 다만 값이 각각 40과 90입니다.
- C와 D, M의 관계는 I와 V, X의 관계와 같으며, 다만 값이 각각 400과 900입니다.
M, D, C, L, X, V, I 문자로만 이루어진 리터럴 중 이 형식을 따르지 않는 것은 문법 오류를 일으킵니다. 명시적인 것이 암시적인 것보다 낫기 때문입니다.
내장 “roman” 함수
새로운 내장 함수 “roman”은 정수를 로마 숫자 리터럴로 변환하는 일을 돕습니다. 이 함수는 객체 하나를 인자로 받아, 같은 값의 리터럴을 담은 문자열을 반환합니다. 인자가 정수도 유리수(PEP 239 참조)도 아니면, 값을 얻기 위해 기존 내장 함수 “int”를 거치게 됩니다. 객체가 부동소수점 수였다면 이 과정에서 정보가 손실될 수 있습니다. 객체가 유리수이면, 결과는 유리수 리터럴(PEP 240 참조) 형식으로 표현되며, 문자열 안의 정수는 로마 숫자 리터럴로 표기됩니다.
호환성 문제
이 제안은 새로운 키워드를 도입하지 않습니다. 모두 대문자이고 M, D, C, L, X, V, I 문자로만 이루어진 변수 이름을 사용하는 프로그램은 새 리터럴의 영향을 받습니다. 이제 이러한 프로그램에서는 해당 변수에 값을 대입할 때 문법 오류가 발생하고, 표현식에서 해당 변수를 참조할 때는 문법 오류나 미묘한 버그가 발생합니다. 이러한 변수 이름은 PEP 8을 위반하므로 해당 코드는 이미 잘못된 것이며, 단지 예외를 발생시키지 않았을 뿐입니다. 이 제안은 언어에서 간과되었던 그 부분을 바로잡습니다.
Copyright
This document has been placed in the public domain.