Python の入力を raw_input よりも使うと便利なことはありますか? 質問する

Python の入力を raw_input よりも使うと便利なことはありますか? 質問する

私は現在、大学 1 年生に Python を教えていますが、input一部の生徒が使用しようと決めた (そして奇妙な動作に困惑した) 一見無害な関数の背後に の呼び出しが隠れていることを知って驚きましたeval

そこで私の質問は、なぜinput関数は を呼び出すのかeval、そして を使用する方が安全でないのにこれが役に立つのはなぜかraw_input、ということです。これは Python 3 で変更されたことは理解していますが、そもそも珍しい設計上の決定のように思えます。

Python 2.x 入力関数のドキュメント

ベストアンサー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 つです。

おすすめ記事