PEP 3141定义了一个带有Complex.__add__
但没有Number.__add__
的数字层次结构。这似乎是一个奇怪的选择,因为(实际上)从Number
派生的其他数字类型Decimal
也实现了一种添加方法。在PEP 3141中,为什么Number没有添加方法?
那么为什么这样呢?如果我想向我的代码添加类型注释或断言,我应该使用x:(Complex, Decimal)
?或者x:Number
并忽略这个声明实际上没有意义的事实?
PEP 3141定义了一个带有Complex.__add__
但没有Number.__add__
的数字层次结构。这似乎是一个奇怪的选择,因为(实际上)从Number
派生的其他数字类型Decimal
也实现了一种添加方法。在PEP 3141中,为什么Number没有添加方法?
那么为什么这样呢?如果我想向我的代码添加类型注释或断言,我应该使用x:(Complex, Decimal)
?或者x:Number
并忽略这个声明实际上没有意义的事实?
我相信答案中可以找到的Rejected Alternatives:
本PEP的最初版本定义由一个Haskell数字前奏[3]包括
MonoidUnderPlus
,AdditiveGroup
,Ring
,并激发的代数层次Field
,并提到其他几个可能的 代数类型,然后才得到数字。我们曾预计这 是有用的使用向量和矩阵,但NumPy的 社会人真的不感兴趣 ...
有些情况显然不支持加入更多的复杂的数字系统。他们本可以更详细地了解他们的阶级层次(原本打算),但对社区缺乏兴趣。因此,只要将Numbers
未指定给任何想要变得更复杂的人就容易了。
请注意,Monoids
是一个仅定义一个二进制操作的示例。
在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
从PEP 3141: “这种类只超载帮助;它不提供任何操作。” (还有:不减,乘法等)。 –
@SimeonVisser你在问这个问题。如果PEP说出于某种原因,那是什么原因?为什么'Complex'定义这些运算符,如果它们不值得在'Number'上定义? – rotu
如果我想定义一个不支持添加的数字类型,该怎么办? Number在层次结构中作为基类存在,但为什么它应该强制必须支持某些操作? –