2011-10-10 22 views
29

Şu an birinci sınıf üniversite öğrencilerine python dersleri veriyorum ve öğrencilerimin bazılarını kullanmaya karar verdikleri görünmez zararsız input işlevini öğrendiklerinde şaşırdım. (eval) o.Python'un girdisini raw_input üzerinden kullanmak hiç işe yaramıyor mu?

Bu yüzden sorum, neden input işlevi eval işlevini çağırıyor ve bu, raw_input ile daha güvenli olmayacak bunun için ne işe yarar? Bunun Python 3'te değiştiğini anlıyorum, ama ilk başta alışılmadık bir tasarım kararı gibi görünüyor.

Python 2.x input function documentation

+7

Code-Golf –

+0

için kullanışlıdır “Neden” cevabını vermek için - Python'un ilk REPL'si 1 iken: 1: print input() '. Eski zamanlarda bahse girerim, iyi programlama pratiklerini desteklemek Python'un şu anki öncelikler listesinde olduğu kadar yüksek değildi. Python 3'ün True: print (eval (input())) 'bile daha kafa karıştırıcı gibi görünebilir - tüm bu iç içe parantezler! –

cevap

34

bitti Python 2'nin girişini kullanmak için hiç kullanışlı mı Ham girdi?

sayılı


input() kullanıcı verir kod değerlendirir. Python'un tam gücünü kullanıcının elinde tutar. Jeneratör ifadeleri/liste anlamaları, __import__ ve if/else operatörleriyle, Python'un yapabileceği her şey tek bir ifade ile elde edilebilir. Kötü niyetli kullanıcılar dosyaları kaldırmak için (__import__('os').remove('precious_file')), programın geri kalanını (setattr(__import__('__main__'), 'function', lambda:42)), ... bir şey için input() kullanabilir.

Normal bir kullanıcının tüm gelişmiş işlevleri kullanması gerekmez. İfadeye ihtiyacınız yoksa, ast.literal_eval(raw_input()) kullanın - literal_eval işlevi güvenlidir.

İleri düzey kullanıcılar için yazıyorsanız, onlara kod girmenin daha iyi bir yolunu verin. Eklentiler, kullanıcı modülleri, vb - sadece işlevsellik değil, tam Python sözdizimi olan bir şey.

Ne yaptığınızı bildiğinizden kesinlikle eminseniz, eval(raw_input()) deyin. eval "Tehlikeli!" Diye bağırıyor. eğitimli göze. Ancak, olasılıklara hiç ihtiyacınız olmayacak.


input()

Python 3 çözme eski tasarım hatalarından biriydi.

+0

Bu, düşündüğüm şeydir. “input” işlevini istediniz, eğer eval (raw_input()) yaptıysanız, en azından tehlikeli olduğunu göreceksiniz. Aksi halde kullanmak için gerçekten iyi bir sebep yok. Teşekkürler! – luketparkinson

4

input hemen hemen interaktif piton kabuğu için bir yapı taşı olarak sadece yararlıdır. Şüphesiz ki, doğru şekilde çalıştığını ve bir yerleşik olmak için oldukça fazla amaca uygun olduğunu - ki bu da Python 3'ten kaldırıldığını tahmin ediyorum.

7

Python Input işlevi, bir nesne döndürür. ifadesi değerlendirmenin sonucu . raw_input fonksiyon, bir String bu çalışan

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 

örnekler verir:

Örnek 1 Örnek

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$ 

S. neden giriş yapar işlev çağrısı mı? piton 2.x raw_input fonksiyonuna bilgi kıyasla kullanıcı girişi bir ifade '45 + 7' girer senaryoyu düşünün

A., giriş doğru sonucu verecektir

+1

alternatif olarak "quit()' e girebilirler. Bu kodlar, kritik bir kod bölümünden kısmen yol alıyorsanız oldukça tehlikelidir ... – tobyodavies

+8

Veya "__import __ ('os')" girdisi olabilir. Remove ('precious_file') ' oldukça tehlikeli * her yerde *. ['ast.literal_eval (raw_input())'] (http://docs.python.org/library/ast.html#ast.literal_eval) neredeyse tüm durumlarda çok daha iyi bir seçimdir. Şaşılacak bir şey yok [Python 3'ün girişi()] (http://docs.python.org/py3k/library/functions.html#input) 2'nin raw_input() gibi çalışır. –

+7

Bu cevaba katılmıyorum. Girişin 52 olması için neden "doğru sonuç" olduğunu düşünüyorsunuz? Doğru sonucu "lütfen bir sayı girin" olarak düşünürdüm. Kullanıcının verebileceği bir Python ifadesinin sonucunu hesaplamak için bir sayı soran bir program için iyi bir neden yoktur. Bu saçma davranış sadece değil, aynı zamanda Petr'in işaret ettiği gibi ciddi bir güvenlik riski de taşıyor. Soru "giriş faydalı" idi ve cevap "hayır". – mgiuca

1

raw_input daha iyidir, Her zaman kullanıcının girişini değiştirmeden döndürür. Tersine input() işlevi, girdiğiniz nesneleri Python koduymuş gibi dönüştürmeye çalışacaktır ve güvenlik sorunları vardır, bundan kaçınmalısınız.

Gerçek programda input() kullanmayın, girdinizi Python kodu olarak değerlendirerek değil, beklediğiniz belirli giriş biçimini işleyen bir şeyle ayrıştırın.

İlgili konular