TL; DR
input
funzione in Python 2.7, valuta qualunque sia la tua immissione, come espressione di Python. Se vuoi semplicemente leggere le stringhe, usa la raw_input
funzione in Python 2.7, che non valuterà le stringhe di lettura.
Se stai usando Python 3.x, raw_input
è stato rinominato in input
. Citando le note di rilascio di Python 3.0 ,
raw_input()
è stato rinominato in input()
. Cioè, la nuova input()
funzione legge una riga sys.stdin
e la restituisce con la nuova riga finale rimossa. Aumenta EOFError
se l'ingresso viene interrotto prematuramente. Per ottenere il vecchio comportamento di input()
, utilizzareeval(input())
In Python 2.7 , ci sono due funzioni che possono essere utilizzate per accettare input dell'utente. Uno è input
e l'altro è raw_input
. Puoi pensare alla relazione tra loro come segue
input = eval(raw_input)
Considera il seguente pezzo di codice per capirlo meglio
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
accetta una stringa dall'utente e valuta la stringa nel contesto Python corrente. Quando digito dude
come input, trova che dude
è legato al valore thefourtheye
e quindi il risultato della valutazione diventa thefourtheye
e al quale viene assegnato input_variable
.
Se inserisco qualcos'altro che non è presente nell'attuale contesto di Python, fallirà NameError
.
>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'dummy' is not defined
Considerazioni sulla sicurezza con Python 2.7 input
:
Poiché qualsiasi tipo di utente viene valutato, impone anche problemi di sicurezza. Ad esempio, se hai già caricato il os
modulo nel tuo programma con import os
, e quindi l'utente digita
os.remove("/etc/hosts")
questo verrà valutato come espressione di chiamata di funzione da Python e verrà eseguito. Se si esegue Python con privilegi elevati, il /etc/hosts
file verrà eliminato. Vedi, quanto potrebbe essere pericoloso?
Per dimostrarlo, proviamo di input
nuovo ad eseguire la funzione.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Ora, quando input("Enter your name: ")
viene eseguito, attende l'input dell'utente e l'input dell'utente è un richiamo della funzione Python valido e quindi viene anche invocato. Ecco perché stiamo vedendo di Enter your name again:
nuovo pronto.
Quindi, stai meglio con la raw_input
funzione, in questo modo
input_variable = raw_input("Enter your name: ")
Se è necessario convertire il risultato in un altro tipo, è possibile utilizzare le funzioni appropriate per convertire la stringa restituita da raw_input
. Ad esempio, per leggere gli input come numeri interi, utilizzare la int
funzione, come mostrato in questa risposta .
In python 3.x , c'è solo una funzione per ottenere input utente e si chiama input
, che è equivalente a Python 2.7 raw_input
.
input
di comportarmi in questo modo, ma solo in 2.7. Cosa dice quando si eseguepython --version
da un prompt dei comandi? In alternativa, cosa succede se scriviimport sys; print(sys.version)
all'inizio della tua sceneggiatura?