2

在 Python 3 中,整数或任何包括浮点数的除法都会产生浮点数:

>>> from fractions import Fraction
>>> f = Fraction(1, 2)
>>> f / 2
Fraction(1, 4)
>>> 2 / f
Fraction(4, 1)
>>> 1 / 2 
0.5
>>> 2 / 1 
2.0
>>> f / .1
5.0
>>> f / .2
2.5
>>> .2 / f
0.4

我想让除法返回分数,即得到以下行为:

>>> 1 / 2
Fraction(1, 2)
>>> 2 / 1
Fraction(2, 1)

我没有成功地尝试重新定义除法:

>>> int.__truediv__ = lambda self, other: Fraction(self) / Fraction(other)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'int'

我有哪些选择?我可以引入MyFraction从分数派生的类。至少我希望能够定义一个类似的dictX

>>> X({'a': 1/3}) == X({'a': Fraction(1, 3)})
True

注意:最初,我描述的行为似乎是预期的行为(参见PEP 238):

如果在 Python 中添加了一个有理类型(参见PEP 239),则整数和长整数的真正除法可能应该返回一个有理类型。这避免了整数和长整数的真正划分丢失信息的问题。但在那之前,为了保持一致性,浮点数是真正除法的唯一选择。

4

1 回答 1

4

您可能不应该这样做,但您可以使用Forbidden Fruit模块对内置类型进行猴子补丁。

于 2013-06-14T13:56:06.103 回答