二と二分の一は 2.5 @ python

今回も METAR/SPECI のハナシ。

METAR/SPECI が報告する形式で小学校算数で習う「帯分数」形式の表現が許されてるのね:

visibility (視程)
1 1 1/2SM

これは、視程が 1.5 statue miles (one and a half statute miles) であることを示してる。今、distn=”1 1/2″、unit=”SM” まで分解できているとして(distn には「M」(less than)プレフィクスがあることはここではいったん置いといて)、この分数表現のまま「Python 数値」に読み替えられないか?

ここまではいいのよね
1 >>> from fractions import Fraction
2 >>> float(Fraction("1/2"))
3 0.5
直接はダメ
1 >>> Fraction("2 1/2")
2 Traceback (most recent call last):
3   File "<stdin>", line 1, in <module>
4   File "c:\Python27\lib\fractions.py", line 125, in __new__
5     numerator)
6 ValueError: Invalid literal for Fraction: '2 1/2'

あ、そうか:

おけ
1 >>> 2 + Fraction("1/2")
2 Fraction(5, 2)
3 >>> sum([Fraction(s) for s in "2 1/2".split(" ")])
4 Fraction(5, 2)

よしよし…。

ただなぁ、python のレベルまでは分数のまま維持出来ても、例えば json にしてなにがしかのクライアントが使う、て時にまた float か文字列にしなきゃならないてのも切ないよなぁ、とも一方では思う。ただその場合の文字列化は過分数(仮分数)のままの方が受け取る方もラクチンだろうから、まぁ決断自体はさしてむつかしくはない。(これをあえて帯分数に戻そうなんて思うかしらね、と思うし。(なぜなら 5/2 がわかりにくけりゃ 2.5 と言えばいいのだから。))