Error de entrada () - NameError: el nombre '...' no está definido
Recibo un error cuando intento ejecutar este sencillo script:
input_variable = input("Enter your name: ")
print("your name is" + input_variable)
Digamos que escribo "amigo", el error que aparece es:
line 1, in <module>
input_variable = input("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
Estoy ejecutando Mac OS X 10.9.1 y estoy usando la aplicación Python Launcher que viene con la instalación de Python 3.3 para ejecutar el script.
TL;DR
input
La función en Python 2.7 evalúa cualquier entrada, como una expresión de Python. Si simplemente desea leer cadenas, utilice raw_input
la función en Python 2.7, que no evaluará las cadenas leídas.
Si está utilizando Python 3.x, raw_input
se le ha cambiado el nombre a input
. Citando las notas de la versión de Python 3.0 ,
raw_input()
pasó a llamarseinput()
. Es decir, la nuevainput()
función lee una líneasys.stdin
y la devuelve sin la nueva línea final. AumentaEOFError
si la entrada finaliza prematuramente. Para obtener el comportamiento anterior deinput()
, utiliceeval(input())
En Python 2.7 , hay dos funciones que se pueden usar para aceptar entradas del usuario. Uno es input
y el otro es raw_input
. Puedes pensar en la relación entre ellos de la siguiente manera.
input = eval(raw_input)
Considere el siguiente fragmento de código para comprender esto mejor
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
acepta una cadena del usuario y evalúa la cadena en el contexto actual de Python. Cuando escribo dude
como entrada, encuentra que dude
está vinculado al valor thefourtheye
y, por lo tanto, el resultado de la evaluación se convierte en thefourtheye
y se asigna a input_variable
.
Si ingreso algo más que no está en el contexto actual de Python, fallará 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
Consideraciones de seguridad con Python 2.7 input
:
Dado que se evalúa cualquier tipo de usuario, también impone problemas de seguridad. Por ejemplo, si ya ha cargado os
el módulo en su programa con import os
y luego el usuario escribe
os.remove("/etc/hosts")
Python evaluará esto como una expresión de llamada de función y se ejecutará. Si está ejecutando Python con privilegios elevados, /etc/hosts
el archivo se eliminará. ¿Ves lo peligroso que podría ser?
Para demostrar esto, intentemos ejecutar input
la función nuevamente.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Ahora, cuando input("Enter your name: ")
se ejecuta, espera la entrada del usuario y la entrada del usuario es una invocación de función de Python válida, por lo que también se invoca. Es por eso que volvemos a ver Enter your name again:
aviso.
Entonces, estarás mejor con raw_input
una función como esta
input_variable = raw_input("Enter your name: ")
Si necesita convertir el resultado a algún otro tipo, puede usar las funciones apropiadas para convertir la cadena devuelta por raw_input
. Por ejemplo, para leer entradas como números enteros, use la int
función, como se muestra en esta respuesta .
En Python 3.x , solo hay una función para obtener entradas del usuario y se llama input
, que es equivalente a la de Python 2.7 raw_input
.
Está ejecutando Python 2, no Python 3. Para que esto funcione en Python 2, use raw_input
.
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)