PEP 239 – Python에 유리수 타입 추가하기
- Author:
- Christopher A. Craig <python-pep at ccraig.org>, Moshe Zadka <moshez at zadka.site.co.il>
- Status:
- Rejected
- Type:
- Standards Track
- Created:
- 11-Mar-2001
- Python-Version:
- 2.2
- Post-History:
- 16-Mar-2001
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
Python에는 무한 정밀도 유리수의 의미를 갖는 숫자 타입이 없습니다. 이 제안은 그러한 타입의 의미를 설명하고, 그러한 타입을 지원하기 위한 내장 함수와 리터럴을 제안합니다. 이 PEP는 유리수를 위한 리터럴을 제안하지 않습니다. 그것은 다른 PEP에 맡깁니다.
근거
유리수 산술은 때때로 더 느리고 메모리를 더 많이 사용하지만(일반적으로 그 정도에 제한이 없습니다), 수의 수학적 이상을 더 가깝게 담아내며 초보자에게 덜 놀라운 동작을 보이는 경향이 있습니다. 유리수의 Python 구현은 많이 작성되었지만, 그중 어느 것도 코어에 포함되어 있지 않으며 어떤 방식으로도 문서화되어 있지 않습니다. 이 때문에 Python에 덜 능숙한 사람들은 이를 훨씬 접하기 어려웠습니다.
RationalType
RationalType이라는 새로운 수치 타입이 추가됩니다. 이 타입의 단항 연산자는 자명한 동작을 수행합니다. 이항 연산자는 정수와 긴 정수를 유리수로, 유리수를 부동소수점 수와 복소수로 강제 변환합니다.
다음 속성이 지원될 것입니다: .numerator와 .denominator. 언어 정의는 다음을 보장합니다.:
r.denominator * r == r.numerator
분자와 분모의 최대공약수(GCD)가 1이고 분모가 양수라는 것입니다.
r.trim(max_denominator) 메서드는 abs(s.denominator) <= max_denominator를 만족하면서 r에 가장 가까운 유리수 s를 반환합니다.
rational() 내장 함수
이 함수의 시그니처는 rational(n, d=1)입니다. n과 d는 모두 정수, 긴 정수 또는 유리수여야 합니다. 다음이 보장됩니다.:
rational(n, d) * d == n
미해결 문제
- 이 타입의 이름을 rational 대신 rat으로 해야 할 수도 있습니다. 누군가는 complex, real, rational, integer(정수)라는 이름의 “추상적인” 순수 수학 타입들과, float, rat, long, int 같은 이름의 “구체적인” 표현 타입들을 두자고 제안했습니다.
- 정수 값을 갖는 유리수를 시퀀스 인덱스로 허용해야 합니까? 예를 들어,
s[5/3 - 2/3]가s[1]과 동등해야 합니까? - 유리수에
shift와mask연산자를 허용해야 합니까? 정수 값을 갖는 유리수에 대해서는 어떻습니까? - Marcin ‘Qrczak’ Kowalczyk가 c.l.py에서 int를 유리수와 통합하는 것에 대한 찬반 인자를 잘 정리했습니다.
int를 유리수와 통합하는 것에 찬성하는 인자:
2 == 2/1이고 어쩌면str(2/1) == '2'이기도 하므로, 객체가 같아 보이는데도 다르게 동작해서 놀라는 일이 줄어듭니다.- 나머지가 없다는 것을 알고 있을 때는
/를 정수 나눗셈에 자유롭게 사용할 수 있습니다(제 생각이 틀려서 나머지가 있다면 아마 나중에 어떤 예외가 발생할 것입니다).
반대하는 인자:
/의 결과를 시퀀스 인덱스로 사용한다면 그것은 대개 오류입니다. 일부 데이터에서는 프로그램이 동작하게 만들어 이 오류를 숨겨서는 안 됩니다. 다른 데이터에서는 프로그램이 제대로 동작하지 않을 것이기 때문입니다.- (이는 통합한 뒤에도 int와 유리수가 서로 다른 타입이라고 가정합니다:) 타입이 값에 따라 달라지는 일은 드물어야 합니다. 변수의 타입을 알면 추론하기가 더 쉽습니다. 그 변수를 어떻게 사용할 수 있는지 알기 때문입니다. 어떤 것이 int임을 확인하면, 이 자리에 사용되는 다른 객체들도 int일 것이라고 기대할 수 있습니다.
- (이는 둘이 같은 타입이라고 가정합니다:) int는 그 자체로 좋은 타입이며, 유리수와 섞여서는 안 됩니다. 어떤 것이 정수라는 사실은 그 타입에 관한 진술로 표현될 수 있어야 합니다. 많은 연산이 int를 요구하며 유리수를 받아들이지 않습니다. 둘을 서로 다른 타입으로 생각하는 것이 자연스럽습니다.
참고 문헌
Copyright
This document has been placed in the public domain.