在 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
从分数派生的类。至少我希望能够定义一个类似的dict
类X
>>> X({'a': 1/3}) == X({'a': Fraction(1, 3)})
True
注意:最初,我描述的行为似乎是预期的行为(参见PEP 238):
如果在 Python 中添加了一个有理类型(参见PEP 239),则整数和长整数的真正除法可能应该返回一个有理类型。这避免了整数和长整数的真正划分丢失信息的问题。但在那之前,为了保持一致性,浮点数是真正除法的唯一选择。