2012-04-06 6 views
0

私はPythonオブジェクトの文字列表現をしたいと思います。私は有名なピクルスでそれをやっていましたが、それがより良いものとより安価なものが存在するかどうかは疑問です。私はreprとevalを使うのが好きではありません。彼らは安全ではありません。Pythonのオブジェクト表現

+2

Pickleも安全ではありません。[pickle文書](http://docs.python.org/library/pickle.html)の上部にある警告をご覧ください。 – agf

答えて

1

YAMLは、データ構造をシリアライズするためのかなり適切な形式です。 JSONと似ていますが、もっとそうです。 PyYAMLライブラリはかなりうまく動作します。データ構造をシリアライズする方法を推測できるだけでなく、かなり具体的になることができます。例については、完全なドキュメントを参照してください。

+0

YAMLまたはJSONは素晴らしい選択。 –

+0

JSONについての素晴らしい点は、標準ライブラリにあることに加えて、YAMLのサブセットであることです。したがって、JSONを使いYAMLに後で移動すると、YAMLパーサは引き続きデータを読み取ることができます。しかし、YAMLは一般的に見栄えが良く、JSONには欠けている機能がいくつかあります。 'import yaml'が失敗した場合、私は通常、オブジェクトダンプをJSONにフォールバックさせます。 – kwatford

0

オブジェクト表現では、シリアル化を意味する場合、pickleはオプションです。より高速な実装が必要な場合は、cPickle

1

repr()を使用して文字列表現を取得し、ast.literal_eval()を使用してオブジェクトを回復してください。

または単にピクルスを使用してください。 Python 2.xを使用している場合は、import cPickleを使用するとより高速なpickleを得ることができますが、Python 3.xでは1つのpickleがあり、それがCです。

個人的には、単純なオブジェクトにJSONを使用したいと思っています。 import jsonを試してみて、効果があるかどうかを確認してください。

+0

ast.literal_eval()とeval()は正確な科学ではありません。複雑なオブジェクトで失敗するのに使用されます。 – Academia

+0

'ast.literal_eval()'はいくつかの限られた場合を除いて 'repr()'からオブジェクトを再構築しません。実際、 '__repr__'がオーバーロードされていない一般的なケースでは、' repr() 'からオブジェクト**を再構築することはできません。これは単に' 'のように見えます。 –

+0

たとえどのような引数を使って構築されたかを常に推測できる不変クラスを持っていても、 '__repr__'を多重定義してコンストラクタ呼び出しのような文字列を生成すると、' ast.literal_eval() 'はまだ処理されませんそれは式なので、リテラルではないからです。 'eval'に移動する必要があります。これは安全ではありません。 –