NaN, None と ValueError: Unknown format code ‘f’ for object of type ‘str’

なんつーか改めて言うことでもないかなとも思うんだけど、無頓着にやってたらちと思い悩んだので一応。

結構なんだかんだ NaN て便利でな:

 1 >>> import math
 2 >>> x = float('nan')
 3 >>> y = 2
 4 >>> math.sqrt(x**2 + y**2)
 5 nan
 6 >>> "{:.1f}".format(x)
 7 'nan'
 8 >>> "{:.1f}".format("a")
 9 Traceback (most recent call last):
10   File "<stdin>", line 1, in <module>
11 ValueError: Unknown format code 'f' for object of type 'str'

てふわけで、Python (やその根底にある C) は NaN について良く知っておるわけね。だから「データがまだ取れてませんよー」のために NaN にしとくのがいい。これを None にしちゃうと:

1 >>> "{:.1f}".format(None)
2 Traceback (most recent call last):
3   File "<stdin>", line 1, in <module>
4 ValueError: Unknown format code 'f' for object of type 'str'

やだよぉもう。

ちなみに「NaN かどうか?」について、(NumPy 普段使いのワタシは) math.isnan の存在に気付いてなかった。なんだよあるじゃん、と。(ただ、numpy.nan はあるのに float.nan とか math.nan みたいなファクトリはないのよね。)