入力データに文字列の分数がやってきたとき、floatに変換したい・・・という気持ちになることがある
目次
Fractionクラスを使う
王道。というか実質的にこれ以外ないと思う。
>>> from fractions import Fraction >>> frac_str = "5/6" >>> float(Fraction(frac_str)) 0.8333333333333334
ちょっと気に食わない気もする。
- なんでこれのためにimport増やさなきゃいけないんだよ
- Pythonicに感じない。もうちょっとエレガントに書けたら嬉しい。
自分でやる
別に難しい処理じゃないので、自分で書いても良いといえば良い。
>>> frac_str = "5/6" >>> (lambda x,y: float(x)/float(y))(*frac_str.split("/")) 0.8333333333333334
lambdaはlispのletと同じ使い方をしたかっただけで、必須ではない。importが減らせた。ただ、やはりPythonicじゃない。展開して書いたら逆に行数増えちゃう訳だし。
evalする
>>> frac_str = "5/6" >>> eval(frac_str) 0.8333333333333334
簡単で嬉しい! どう考えてもPythonicじゃなく、プログラミング作法としても確実に良くない。分数以外が来たとき、pythonの式として評価できれば落ちてくれないし、ユーザー入力に対して使ったりした日には、「悪意のあるコード」が入力されて制御が乗っ取られたりするかもしれない。・・・pythonワンライナーでexploit code書く気概のあるハッカーがいれば。
できないやり方
これができれば良かったのだが、できないのだった。
>>> frac_str = "5/6" >>> float(frac_str) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: could not convert string to float: '5/6'
まとめ
Fraction使わないでまともに書く方法ねーのかな? ちょっと面倒くさいんだけど。ご存じの方は教えてください。