Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 239 – 파이썬에 유리수 타입 추가

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 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

Warning

This PEP has been rejected.

×

이론적 근거 절에서 설명한 요구 사항은 십진 연산을 위한 PEP 327의 채택으로 어느 정도 해소되었습니다. Guido는 또한 “유리수 연산은 ABC에서 기본 ‘정확한’ 연산이었지만 기대한 대로 작동하지 않았다”고 언급했습니다. 2005년 6월 17일의 python-dev 논의를 참조하십시오 [1].

추신: “숫자를 위한 타입 계층 구조”인 PEP 3141의 채택으로, ‘fractions’ 모듈에 구체적인 구현을 갖춘 ‘Rational’ 숫자 추상 베이스 클래스가 추가되었습니다.

초록

파이썬에는 무한히 정밀한 유리수의 의미론을 갖는 숫자 타입이 없습니다. 이 제안서는 그러한 타입의 의미론을 설명하고, 그러한 타입을 지원하기 위한 내장 함수와 리터럴을 제안합니다. 이 PEP는 유리수를 위한 리터럴을 제안하지 않으며, 이는 다른 PEP에 남겨둡니다.

이론적 근거

유리수 연산은 때때로 더 느리고 메모리를 더 많이 사용하지만(일반적으로는 무한정 그러함), 숫자에 대한 수학적 이상에 더 가깝게 부합하며, 초보자에게 덜 놀라운 동작을 보이는 경향이 있습니다. 유리수에 대한 많은 파이썬 구현이 작성되었지만, 이들 중 어느 것도 코어에 존재하지 않으며 어떤 식으로도 문서화되어 있지 않습니다. 이로 인해 파이썬에 덜 능숙한 사람들이 이를 훨씬 더 접근하기 어렵게 되었습니다.

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) 시그니처를 가질 것입니다. nd는 둘 다 정수, 롱 정수, 또는 유리수여야 합니다. 다음을 보장합니다.:

rational(n, d) * d == n

미해결 쟁점

  • 이 타입은 rational이 아니라 rat이라고 불러야 할지도 모릅니다. 어떤 사람은 complex, real, rational, integer라는 이름의 “추상적인” 순수 수학 타입과, float, rat, long, int 같은 이름의 “구체적인” 표현 타입을 두자고 제안했습니다.
  • 정수 값을 갖는 유리수를 시퀀스 인덱스로 허용해야 할지 여부입니다. 예를 들어, s[5/3 - 2/3]s[1]과 동등해야 할지 여부입니다.
  • 유리수에 대해 shiftmask 연산자를 허용해야 합니까? 정수 값을 갖는 유리수에 대해서는 어떻습니까?
  • Marcin ‘Qrczak’ Kowalczyk는 c.l.py에서 정수와 유리수를 통합하는 것에 대한 찬반 논거를 잘 요약했습니다.

    정수와 유리수를 통합하는 것에 찬성하는 논거:

    • 2 == 2/1이고 아마도 str(2/1) == '2'이기 때문에, 객체들이 같아 보이지만 다르게 동작하는 데서 오는 놀라움을 줄여줍니다.
    • 나눗셈에 나머지가 없다는 것을 알고 있을 때는 /를 정수 나눗셈에 자유롭게 사용할 수 있습니다(만약 제가 틀려서 나머지가 있다면, 나중에 아마 예외가 발생할 것입니다).

    반대하는 논거:

    • /의 결과를 시퀀스 인덱스로 사용할 때, 이는 보통 오류이며 일부 데이터에서는 프로그램이 동작하도록 만들어 그 오류를 숨겨서는 안 됩니다. 다른 데이터에서는 오류가 발생할 것이기 때문입니다.
    • (이는 통합 이후 int와 rational이 서로 다른 타입이 된다고 가정합니다:) 타입은 값에 좌우되는 경우가 거의 없어야 합니다. 변수의 타입을 알고 있을 때 추론하기가 더 쉽습니다: 그것을 어떻게 사용할 수 있는지 알기 때문입니다. 어떤 것이 int라는 것을 판별할 수 있으면 이 위치에서 사용되는 다른 객체들도 int일 것이라고 기대할 수 있습니다.
    • (이는 그 둘에 대해 같은 타입을 가정합니다:) Int는 그 자체로 좋은 타입이며, rational과 섞여서는 안 됩니다. 어떤 것이 정수라는 사실은 그 타입에 관한 진술로 표현될 수 있어야 합니다. 많은 연산이 int를 요구하며 rational을 받아들이지 않습니다. 그것들을 서로 다른 타입으로 생각하는 것이 자연스럽습니다.

참고 문헌