私はeval()
過去に(そして今でも時々使用しています)、迅速で汚い操作中にデータをマッサージするために使用しました。これは、仕事を成し遂げるために使用できるツールキットの一部ですが、他の回答で言及されているすべての理由により、コマンドラインツールやスクリプトなど 、本番環境で使用する予定のものには決して使用しないでください。
ユーザーが正しいことをすることを信頼することはできません。ほとんどの場合、彼らはそうしますが、あなたが思いもよらなかったすべてのことを実行し、あなたが予期していなかったすべてのバグを見つけてくれることを期待する必要があります。これはまさにeval()
、ツールから責任へと変わるところです。
この完璧な例は、QuerySet
. クエリに渡されるパラメーターは、次のようなキーワード引数を受け入れます。
results = Foo.objects.filter(whatever__contains='pizza')
プログラムで引数を割り当てている場合は、次のようにすることを考えるかもしれません。
results = eval("Foo.objects.filter(%s__%s=%s)" % (field, matcher, value))
しかし、 を使用しないより良い方法が常にありますeval()
。これは、参照によって辞書を渡すことです。
results = Foo.objects.filter( **{'%s__%s' % (field, matcher): value} )
このようにすることで、パフォーマンスが向上するだけでなく、より安全でより Pythonic になります。
この話の教訓?
の使用はeval()
、小さなタスク、テスト、および本当に一時的なものには問題ありませんが、ほぼ確実にそれを行うためのより良い方法があるため、永続的な使用には適していません!