在PEP 3141中,为什么没有数字有一个添加方法?

时间:2017-03-12 00:58:46

标签: python python-3.x

PEP 3141定义了一个数字层次结构Complex.__add__但没有Number.__add__。这似乎是一个奇怪的选择,因为(虚拟地)派生自Decimal的其他数字类型Number也实现了一个add方法。

那么为什么会这样呢?如果我想在代码中添加类型注释或断言,我应该使用x:(Complex, Decimal)吗?或x:Number而忽略了这个声明实际上毫无意义的事实?

2 个答案:

答案 0 :(得分:2)

我相信答案可以在Rejected Alternatives

中找到
  

此PEP的初始版本定义了代数层次结构   灵感来自Haskell Numeric Prelude [3],包括MonoidUnderPlus,   AdditiveGroupRingField,并提到了其他一些可能的内容   在得到数字之前的代数类型。我们曾预料到这一点   对使用矢量和矩阵的人有用,但NumPy   社区真的不感兴趣 ......

有更复杂的数字系统,显然不支持添加。他们本可以更详细地介绍他们的类层次结构(原本打算),但是对社区缺乏兴趣。因此,对于想要变得更复杂的人来说,更容易让Numbers未指定。

请注意,Monoids是仅定义一个二进制操作的示例。

答案 1 :(得分:2)

在numbers.py中。关于Decimal和Real的注释。

 24 ## Notes on Decimal
 25 ## ----------------
 26 ## Decimal has all of the methods specified by the Real abc, but it should
 27 ## not be registered as a Real because decimals do not interoperate with
 28 ## binary floats (i.e.  Decimal('3.14') + 2.71828 is undefined).  But,
 29 ## abstract reals are expected to interoperate (i.e. R1 + R2 should be
 30 ## expected to work if R1 and R2 are both Reals).

并在此处提供了一些相关链接。真的是一个很好的问题,让我开始挖洞。 :P