4

Python辞書としてフォーマットされた文字列を受け取るコードがあります

"{'a':'1','b':'2',...}"

これを適切な辞書に変換する必要があります。

私は2つのアプローチを試しました。を使用するjson.loads(s)と、ast.literal_eval(s) astははるかに堅牢で、文字列内の任意の形式の引用符を受け入れて「正しく機能する」ようですが、jsonは引用符の詳細について非常に慎重であり、単一の形式で失敗することはありません。引用形式の。私は本当に入力に対して可能な限り柔軟になりたいので、使用することを好みますastが、私の同僚の何人かは、それが「安全な」モジュールおよび使用する機能ではないかもしれないと主張します。

特にjson.loads()と比較して、astおよびast.literal_eval()の安全性について誰かがアドバイスできますか?

ありがとう

4

1 に答える 1

8

使用ast.literal_eval()-それはあなたが望むことをするように設計されています。JSONは構文が一致するときに機能しますが、それは信頼できるものではありません。

安全性に関してliteral_eval()は、信頼できないソースからのデータで安全に使用できるように特別に設計されています。実際、ドキュメントの最初の単語は「安全に」です。

式ノードまたはPython式を含む文字列を安全に評価します。提供される文字列またはノードは、次のPythonリテラル構造のみで構成されます:文字列、数値、タプル、リスト、dict、ブール値、およびなし。

これは、値を自分で解析することなく、信頼できないソースからのPython式を含む文字列を安全に評価するために使用できます。

それを使用しないようにアドバイスした人はおそらく考えていたでしょうeval()、それは確かに安全ではありません。

于 2012-10-04T20:13:22.183 に答える