repr/evalでお手軽シリアライズ?

Pythonのreprとevalを使ったらお手軽にシリアライズ・デシリアライズできるんじゃないか?

>>> d = {"x": 1.0, "y": 0.5}
>>> repr(d)
"{'y': 0.5, 'x': 1.0}"
>>> eval(repr(d))
{'y': 0.5, 'x': 1.0}

という話を聞いて「いやいやNaNとかInfinityとかが通らないでしょ」と思ったわけだけど

>>> d = {"x": 1e999, "y": 1e999 / 1e999}
>>> d
{'y': nan, 'x': inf}
>>> repr(d)
"{'y': nan, 'x': inf}"
>>> eval(repr(d))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'nan' is not defined

週が開けてから、つっこむべきはそこじゃなくて「jsonモジュールを使えばいいじゃん」だと気づいた

>>> import json
>>> json.dumps(d)
'{"y": NaN, "x": Infinity}'
>>> json.loads(json.dumps(d))
{u'y': nan, u'x': inf}

jsonモジュールは2.6から標準添付だよ!