私は現在、大学 1 年生に Python を教えていますが、input
一部の生徒が使用しようと決めた (そして奇妙な動作に困惑した) 一見無害な関数の背後に の呼び出しが隠れていることを知って驚きましたeval
。
そこで私の質問は、なぜinput
関数は を呼び出すのかeval
、そして を使用する方が安全でないのにこれが役に立つのはなぜかraw_input
、ということです。これは Python 3 で変更されたことは理解していますが、そもそも珍しい設計上の決定のように思えます。
ベストアンサー1
raw_input よりも Python 2 の入力を使用すると便利なことはありますか?
いいえ。
input()
ユーザーが与えたコードを評価する。これにより、Pythonのパワーをユーザーがフルに活用できるようになる。ジェネレータ式/リスト内包表記を使用すると、__import__
、およびif/else
演算子を使用すると、文字通り Python で実行できることはすべて、1 つの式で実現できます。悪意のあるユーザーは、これを使用して、input()
ファイルを削除したり ( __import__('os').remove('precious_file')
)、プログラムの残りの部分にモンキーパッチを適用したり ( setattr(__import__('__main__'), 'function', lambda:42)
)、... 何でも実行できます。
ast.literal_eval(raw_input())
通常のユーザーは、高度な機能をすべて使用する必要はありません。式が必要ない場合は、literal_eval
機能は安全です。
上級ユーザー向けに作成する場合は、コードを入力するより良い方法を提供します。プラグイン、ユーザー モジュールなど、機能だけでなく完全な Python 構文を備えたものを用意します。
自分が何をしているのかを絶対にわかっている場合は、 と言いますeval(raw_input())
。eval
訓練された目には「私は危険だ!」と叫んでいるように見えます。しかし、おそらくこれが必要になることはないでしょう。
input()
これは Python 3 が解決している古い設計ミスの 1 つです。