PEP 3141定义了一个数字层次结构Complex.__add__
但没有Number.__add__
。这似乎是一个奇怪的选择,因为(虚拟地)派生自Decimal
的其他数字类型Number
也实现了一个add方法。
那么为什么会这样呢?如果我想在代码中添加类型注释或断言,我应该使用x:(Complex, Decimal)
吗?或x:Number
而忽略了这个声明实际上毫无意义的事实?
答案 0 :(得分:2)
我相信答案可以在Rejected Alternatives:
中找到此PEP的初始版本定义了代数层次结构 灵感来自Haskell Numeric Prelude [3],包括
MonoidUnderPlus
,AdditiveGroup
,Ring
和Field
,并提到了其他一些可能的内容 在得到数字之前的代数类型。我们曾预料到这一点 对使用矢量和矩阵的人有用,但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