1. ホーム
  2. パイソン

[解決済み】pythonのeval()とast.literal_eval()の使い分けについて)

2022-04-05 21:16:50

質問

あるコードで、以下のような状況があります。 eval() が解決策になりそうです。 現在、私はこれまで eval() しかし、この方法が引き起こす潜在的な危険性については、多くの情報を目にすることができました。 そのため、私はこれを使うことに非常に慎重になっています。

私の状況は、ユーザーからの入力があることです。

datamap = input('Provide some data here: ')

ここで datamap は辞書である必要があります。 いろいろ検索してみると eval() は、これを解決することができました。データを使おうとする前に入力の型を確認することができ、セキュリティ対策として有効なのではないかと思いました。

datamap = eval(input('Provide some data here: ')
if not isinstance(datamap, dict):
    return

ドキュメントに目を通しましたが、これが安全かどうかまだ不明です。 evalはデータが入力されるとすぐに評価するのか、それとも datamap 変数が呼び出されるのでしょうか?

ast モジュールの .literal_eval() が唯一の安全な選択肢なのか?

解決方法は?

datamap = eval(input('Provide some data here: ')) は、実際にコードを評価することを意味します。 前に 安全でないかどうかを判断します。関数が呼び出されると同時にコードを評価するのです。以下も参照してください。 の危険性 eval .

ast.literal_eval は入力が有効な Python データ型でない場合に例外を発生させるので、入力が有効でない場合はコードは実行されません。

使用方法 ast.literal_eval が必要な場合は eval . 通常、リテラルなPython文は評価しない方がよいでしょう。