2011-10-10 10 views
29

私は現在、最初の年の大学生パイソンを教える、と私は私の学生の一部が使用することを決めていた(と奇数行動に混乱していた)、後ろのevalに電話を隠したことが、一見無害input機能することを学ぶために驚きましたそれ。raw_inputでPythonの入力を使用することはこれまでに便利ですか?

input関数がevalを呼び出すのはなぜですか、これはraw_inputとは安全ではないと考えられる理由は何ですか?私はこれがPython 3で変更されたことを理解していますが、最初は珍しい設計決定のようです。

Python 2.x input function documentation

+7

これはコードゴルフに便利です –

+0

"理由" - Pythonの最初のREPLが 'while 1:print input()'だったのかもしれません。私はその古き良き時代に賭けました。優れたプログラミング慣行をサポートすることは、Pythonの優先順位のリストではそれほど高くはありませんでした。 Python 3の 'true True:print(eval(input)))'は混乱しているように見えるかもしれません。 –

答えて

34

オーバーPythonの2の入力を使用するために、これまでに便利ですraw_input?


input()ユーザがそれを与えるコードを評価します。これはPythonのフルパワーをユーザの手に渡します。ジェネレータ式/リスト内包、__import__、およびif/else事業者と、文字通りPythonは何かできることは、単一の式で達成することができます。悪意のあるユーザーは、プログラム(setattr(__import__('__main__'), 'function', lambda:42))の残りの部分をモンキーパッチ、ファイル(__import__('os').remove('precious_file'))を除去するinput()を使用することができます...何でも。

通常のユーザは、すべての高度な機能を使用する必要はありません。式が必要ない場合は、ast.literal_eval(raw_input())を使用してください。literal_eval関数は安全です。

あなたは、高度なユーザーのために書いている場合は、それらを入力コードへのより良い方法を与えます。プラグイン、ユーザモジュールなど - 機能だけでなくPythonの完全な構文を持つもの。

あなたは何をやっている知っている絶対的に確信している場合は、eval(raw_input())を言います。 evalは「私は危険です!」と叫びます。訓練された目に。しかし、あなたがこれを必要としないことは間違いありません。


input()は、Python 3が解決されている古い設計ミスの一つでした。

+0

これは私が考えていたものですあなたは 'input'の機能を望んでいました。もしあなたが' eval(raw_input()) 'を実行したなら、少なくとも危険であることを知るでしょう。そうでなければそれを使う良い理由はありません。ありがとう! – luketparkinson

4

inputはかなりインタラクティブPythonシェルのためのビルディングブロックとしてのみ有用です。 Python 3から削除された理由は私が推測するところです。

7

Pythonの入力関数は、オブジェクトを返します表現を評価する結果は です。

例:1

Prompt$ python yraw 
Please enter your age 45 
Please enter your age again 45 
You said you are 45 Then you said you are 45 

例:2

Prompt$ python yraw 
Please enter your age 45 + 7 
Please enter your age again 45 + 7 
You said you are 45 + 7 Then you said you are 52 
Prompt$ 

入力を行う理由Q. raw_input機能は、その走行

name = "Arthur" 
age = 45 

first = raw_input("Please enter your age ") 
second = input("Please enter your age again ") 

# first will always contain a string 

# second could contain any object and you can even 
# type in a calculation and use "name" and "age" as 
# you enter it at run time ... 

print "You said you are",first 
print "Then you said you are",second 

例文字列を返します関数呼び出しeval? Pythonの2.xの中でraw_inputと比較して、ユーザが入力中の式'45 + 7' を入力シナリオを検討して

A.は、入力が正しい結果が得られます

+1

代わりに、彼らは 'quit()'を入力することができます。これは、コードのクリティカルセクションの途中にある場合、かなり危険です... – tobyodavies

+8

または、 '__import __( 'os')。どこか危険な*どこでも*。 ['ast.literal_eval(raw_input())'](http://docs.python.org/library/ast.html#ast.literal_eval)は、事実上すべての状況でずっと良い選択です。 [Python 3のinput()](http://docs.python.org/py3k/library/functions.html#input)は、2のraw_input()と同じように機能します。 –

+7

私はこの回答に同意しません。あなたは入力が52であるという「正しい結果」をどうして考えていますか?正しい結果が「数字を入力してください」と考えています。ユーザーが与える可能性があるPython式の結果を計算するために数値を要求するプログラムには、正当な理由はありません。この不条理な行動だけでなく、Petrが指摘しているように重大なセキュリティリスクもあります。質問は「有用な入力」であり、答えは「いいえ」です。 – mgiuca

1

raw_inputが優れています。常に変更なしでユーザーの入力を返します。 逆にinput()関数は、入力したものをPythonコードであるかのように変換しようとしますが、セキュリティ上の問題があるため、回避する必要があります。

実際のプログラムでは、input()を使用しないでください。入力をPythonコードとして評価するのではなく、期待している特定の入力フォーマットを処理するもので構文解析します。

関連する問題