Python 3 では、整数の除算、または float を含むものはすべて float になります。
>>> 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
Fraction から派生したクラスを導入しても問題ありません。少なくとも、次のようdict
なクラスを定義できるようにしたいと思いますX
>>> X({'a': 1/3}) == X({'a': Fraction(1, 3)})
True
注意: もともと、私が説明した動作は意図したものだったようです ( PEP 238を参照)。
Python に有理数型が追加された場合 ( PEP 239を参照)、int と long の真の除算はおそらく有理数を返すはずです。これにより、int と long の実際の除算で情報が失われるという問題が回避されます。しかし、それまでは、一貫性を保つために、float が真の除算の唯一の選択肢です。