2017-03-12 34 views
3

PEP 3141定义了一个带有Complex.__add__但没有Number.__add__的数字层次结构。这似乎是一个奇怪的选择,因为(实际上)从Number派生的其他数字类型Decimal也实现了一种添加方法。在PEP 3141中,为什么Number没有添加方法?

那么为什么这样呢?如果我想向我的代码添加类型注释或断言,我应该使用x:(Complex, Decimal)?或者x:Number并忽略这个声明实际上没有意义的事实?

+0

从PEP 3141: “这种类只超载帮助;它不提供任何操作。” (还有:不减,乘法等)。 –

+0

@SimeonVisser你在问这个问题。如果PEP说出于某种原因,那是什么原因?为什么'Complex'定义这些运算符,如果它们不值得在'Number'上定义? – rotu

+0

如果我想定义一个不支持添加的数字类型,该怎么办? Number在层次结构中作为基类存在,但为什么它应该强制必须支持某些操作? –

回答

2

我相信答案中可以找到的Rejected Alternatives

本PEP的最初版本定义由一个Haskell数字前奏[3]包括MonoidUnderPlusAdditiveGroupRing,并激发的代数层次 Field,并提到其他几个可能的 代数类型,然后才得到数字。我们曾预计这 是有用的使用向量和矩阵,但NumPy的 社会人真的不感兴趣 ...

有些情况显然不支持加入更多的复杂的数字系统。他们本可以更详细地了解他们的阶级层次(原本打算),但对社区缺乏兴趣。因此,只要将Numbers未指定给任何想要变得更复杂的人就容易了。

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

2

在numbers.py中。有小数和真实的注释。

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

相关问题