静かなる名辞

pythonとプログラミングのこと


【python】分数の文字列をfloatに変換する

 入力データに文字列の分数がやってきたとき、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使わないでまともに書く方法ねーのかな? ちょっと面倒くさいんだけど。ご存じの方は教えてください。