2017-08-25 17 views
3

をint型との違いは、私はeval(input(a))がintに自動的に文字列を変換することを聞いたが、入力時の私のコードPYTHON評価およびそれ以前

age = eval(input("enter age")) 

が、私はそれが誤りである01に入力するが、ときに私ならば何でありますコード

age = int(input("enter age")) 

01が入力として完全に機能します。それはなぜです?

+2

@cᴏʟᴅsᴘᴇᴇᴅどのように適切なデュープターゲットですか?このリンクは、主要なゼロ問題を説明していません。 – vaultah

+1

彼はpythonの重複を知っていますか?問題は良いです。 –

+0

さて、みんな、再開。 –

答えて

4

evalは、Pythonの式を評価します。 Python 3では、0で始まる数字は許可されません(0000を除く、Why does 000 evaluate to 0 in Python 3?を参照)。 Python 2では、これらは8進数(8進数)として解釈されます。ない方が良いが...(のpython 3ベース8は今、排他的使用Ooプレフィックス)

intが、それは(あなたが必要としないこと)複雑な式を評価することはできませんので、変換を整数に文字列を実行し、それにさらされていませんこの先行ゼロ構文。

もう一つの便利な機能は、入力された式は、単純な有資格try/exceptブロックを使用して、整数であるかどうかをチェックできるということです。(あなたはすべての例外から保護しなければならないeval付き)

while True: 
    try: 
     age = int(input("enter age")) 
     break 
    except ValueError: 
     print("Retry!") 

アドバイス:システムコールやファイルの削除を含め、の式を評価することができます(評価はと評価されています)、安全性に欠けるため、intを使用してください。

注:上記のコードは、Python 2ではまだ安全ではありません。のように動作します:inputあなたのモジュールの開始時に簡単なコードでこれに対するあなたのコードを保護することができます:

try: 
    input = raw_input 
except NameError: 
    pass 

ので、pythonの2 inputはもはや到達できないで、代わりにraw_inputを呼び出します。 Python 3はそのコードを無視します。

+5

安全であるだけでなく、 'int'が生成できない場合には再試行することができます。 1 ... –

+0

良い点があります。編集しました –

+0

'eval'は大変複雑な表現をするのに使われるので、' int'は文字列を整数に変換するだけですが、それを理解できますか? 8進数とゼロ構文は何ですか? –

1

eval()は、式を検証するために使用されます。 Onは8進数(0から始まる数字)を除いて式と見なされます。 Int()は、文字列から整数への変換を処理します。 evalの使用を避けるべき理由はたくさんあります。ただ、心に留めておく:

のPython 2.xの
のx = raw_input( 'ここに数値を入力します: '):

のx =入力(' ここに数値を入力します')

のPython 3.xの

のPython 2.xの
セキュリティリスク:
のx =入力( 'ここに番号を入力してください。')

のPython 3.xの
セキュリティリスク: x = eval(入力(ここに数字を入力してください))

また、eval()はコードを実行する可能性があるため、セキュリティ上のリスクが大きくなる可能性があります。あなたが何をしているのかを明確に理解していないか、アプリケーションを危険にさらす可能性がある場合を除き、私はそれを使用しないことをお勧めします

+0

どのようなセキュリティリスクがありますか?私はプログラミングの初心者です –

+0

多くの異なる例と解説をここで確認することができます(ここではhttps://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) –

+0

例えば 'import subprocess; eval( "subprocess.run( '私が好きなプログラム)')")は非常に危険であり、ユーザーはおそらくそれを行うことを許可されるべきではありません。したがって、 'eval'には100%信頼できる入力だけを渡すべきです。 – user1747134

関連する問題