PEP 239 – 为 Python 添加有理数类型
- 作者:
- Christopher A. Craig <python-pep at ccraig.org>, Moshe Zadka <moshez at zadka.site.co.il>
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建日期:
- 2001年3月11日
- Python 版本:
- 2.2
- 发布历史:
- 2001年3月16日
摘要
Python 没有具有无限精确有理数语义的数字类型。本提案解释了这种类型的语义,并建议了支持这种类型的内置函数和字面量。本 PEP 不建议有理数的字面量;这留待另一个 PEP。
基本原理
尽管有时速度较慢且更占用内存(通常是无限的),有理数算术更接近数学上理想的数字概念,并且其行为对新手来说更不容易产生意外。尽管已经编写了许多 Python 有理数实现,但这些都没有存在于核心中,也没有以任何方式进行文档化。这使得它们对不太熟悉 Python 的人来说更难访问。
有理数类型
将添加一个名为 RationalType 的新数字类型。其一元运算符将执行显而易见的操作。二元运算符将整数和长整数强制转换为有理数,并将有理数强制转换为浮点数和复数。
将支持以下属性:.numerator 和 .denominator。语言定义将保证:
r.denominator * r == r.numerator
分子和分母的最大公约数为 1 且分母为正。
方法 r.trim(max_denominator) 将返回最接近 r 的有理数 s,使得 abs(s.denominator) <= max_denominator。
rational() 内置函数
此函数将具有签名 rational(n, d=1)。n 和 d 都必须是整数、长整数或有理数。做出以下保证:
rational(n, d) * d == n
未解决的问题
- 也许类型应该叫做 rat 而不是 rational。有人建议我们有“抽象”的纯数学类型,命名为 complex、real、rational、integer,以及具有 float、rat、long、int 等名称的“具体”表示类型。
- 具有整数值的有理数是否应允许作为序列索引?例如,
s[5/3 - 2/3]是否应等同于s[1]? - 有理数是否允许使用
shift和mask运算符?对于具有整数值的有理数呢? - Marcin 'Qrczak' Kowalczyk 在 c.l.py 上很好地总结了将整数与有理数统一的论点。
统一整数与有理数的论点
- 由于
2 == 2/1并且可能str(2/1) == '2',它减少了对象看起来相等但行为不同的意外情况。 - 当我知道没有余数时(如果我错了有余数,则后面可能会出现异常),
/可以自由用于整数除法。
反对意见
- 当我将
/的结果用作序列索引时,通常是一个错误,不应该通过使程序对某些数据工作而对其他数据中断来隐藏。 - (这假设统一后 int 和 rational 将是不同的类型:)类型很少应依赖于值。当已知变量类型时,推理更容易:我知道如何使用它。我可以确定某个东西是 int,并期望在此处使用的其他对象也将是 int。
- (这假设它们是相同的类型:)int 本身是一个很好的类型,不应与有理数混淆。某个东西是整数的事实应该可以作为对其类型的声明来表达。许多操作需要 int 并且不接受有理数。将它们视为不同的类型是很自然的。
- 由于
参考资料
版权
本文档已置于公共领域。
来源: https://github.com/python/peps/blob/main/peps/pep-0239.rst
最后修改: 2025-02-01 08:50:23 GMT