Error de entrada () - NameError: el nombre '...' no está definido

Resuelto chillpenguin asked hace 10 años • 0 respuestas

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.

chillpenguin avatar Jan 15 '14 02:01 chillpenguin
Aceptado

TL;DR

inputLa función en Python 2.7 evalúa cualquier entrada, como una expresión de Python. Si simplemente desea leer cadenas, utilice raw_inputla función en Python 2.7, que no evaluará las cadenas leídas.

Si está utilizando Python 3.x, raw_inputse le ha cambiado el nombre a input. Citando las notas de la versión de Python 3.0 ,

raw_input()pasó a llamarse input(). Es decir, la nueva input()función lee una línea sys.stdiny la devuelve sin la nueva línea final. Aumenta EOFErrorsi la entrada finaliza prematuramente. Para obtener el comportamiento anterior de input(), utiliceeval(input())


En Python 2.7 , hay dos funciones que se pueden usar para aceptar entradas del usuario. Uno es inputy 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'

inputacepta una cadena del usuario y evalúa la cadena en el contexto actual de Python. Cuando escribo dudecomo entrada, encuentra que dudeestá vinculado al valor thefourtheyey, por lo tanto, el resultado de la evaluación se convierte en thefourtheyey 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 osel módulo en su programa con import osy 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/hostsel archivo se eliminará. ¿Ves lo peligroso que podría ser?

Para demostrar esto, intentemos ejecutar inputla 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_inputuna 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 intfunció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.

thefourtheye avatar Jan 14 '2014 20:01 thefourtheye

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)
 avatar Jan 14 '2014 19:01