funcion - repr python
¿Qué hace la evaluación de Python()? (9)
En el libro que estoy leyendo en Python, sigue usando el código eval(input(''blah''))
Leí la documentación y la comprendo, pero sigo sin ver cómo cambia la función input()
.
¿Qué hace? ¿Alguien puede explicar?
En Python 2.x, la input(...)
es equivalente a eval(raw_input(...))
, en Python 3.x se cambió input
nombre de raw_input
, que sospecho que raw_input
confusión (probablemente raw_input
la documentación para input
en Python 2.x). Además, eval(input(...))
funcionaría bien en Python 3.x, pero generaría un TypeError
en Python 2.
En este caso, eval
se utiliza para forzar la cadena devuelta desde la input
a una expresión y se interpreta. Generalmente esto se considera una mala práctica.
La función eval permite que un programa Python ejecute el código Python dentro de sí mismo.
Ejemplo de eval (shell interactivo):
>>> x = 1
>>> eval(''x + 1'')
2
>>> eval(''x'')
1
Llego tarde a responder esta pregunta pero, nadie parece dar una respuesta clara a la pregunta.
Si un usuario ingresa un valor numérico, input()
devolverá una cadena.
>>> input(''Enter a number: '')
Enter a number: 3
>>> ''3''
>>> input(''Enter a number: '')
Enter a number: 1+1
''1+1''
Por lo tanto, eval()
evaluará el valor devuelto (o expresión) que es una cadena y devolverá un entero / float.
>>> eval(input(''Enter a number: ''))
Enter a number: 1+1
2
>>>
>>> eval(input(''Enter a number: ''))
Enter a number: 3.14
3.14
Por supuesto, esto es una mala práctica. int()
o float()
deben usarse en lugar de eval()
en este caso.
>>> float(input(''Enter a number: ''))
Enter a number: 3.14
3.14
Muchas buenas respuestas aquí, pero ninguna describe el uso de eval()
en el contexto de sus globals=
y locals=
kwargs. Se pueden usar para limitar los métodos que están disponibles a través del método eval
. Por ejemplo, si carga un intérprete de Python nuevo, locals()
y globals()
serán iguales y se verán así:
>>> globals()
{''__loader__'': <class ''_frozen_importlib.BuiltinImporter''>, ''__doc__'': None,
''__spec__'': None, ''__builtins__'': <module ''builtins'' (built-in)>,
''__package__'': None, ''__name__'': ''__main__''}
Ciertamente, hay métodos dentro del módulo builtins
que pueden causar un daño significativo a un sistema. Pero es posible bloquear cualquier cosa y todo lo que no queramos disponible. Tomemos un ejemplo. Digamos que queremos construir una lista para representar un dominio de los núcleos disponibles en un sistema. Para mí tengo 8 núcleos, así que querría una lista [1, 8]
.
>>>from os import cpu_count()
>>>eval(''[1, cpu_count()]'')
[1, 8]
Asimismo, todos los __builtins__
están disponibles.
>>>eval(''abs(-1)'')
1
De acuerdo. Entonces, vemos un método que queremos exponer y un ejemplo de uno (de muchos que pueden ser mucho más complejos) que no deseamos exponer. Así que vamos a bloquear todo.
>>>eval(''[1, cpu_count()]'', {''__builtins__'':None}, {})
TypeError: ''NoneType'' object is not subscriptable
Hemos bloqueado efectivamente todos los métodos __builtins__
y, como tal, __builtins__
un nivel de protección en nuestro sistema. En este punto, podemos comenzar a agregar de nuevo los métodos que deseamos exponer.
>>>from os import cpu_count
>>>exposed_methods = {''cpu_count'': cpu_count}
>>>eval(''cpu_count()'', {''__builtins__'':None}, exposed_methods)
8
>>>eval(''abs(cpu_count())'', {''__builtins__'':None}, exposed_methods)
TypeError: ''NoneType'' object is not subscriptable
Ahora tenemos el método cpu_count disponible mientras aún bloqueamos todo lo que no deseamos. En mi opinión, esto es súper poderoso y claramente del alcance de las otras respuestas no es una implementación común. Existen numerosos usos para algo como esto y, siempre que se maneje correctamente, personalmente creo que eval
puede ser usado de manera segura y de gran valor.
nótese bien
Otra cosa que es genial acerca de estos kwargs
es que puedes comenzar a usar la taquigrafía para tu código. Digamos que utiliza eval como parte de una tubería para ejecutar un texto importado. El texto no necesita tener un código exacto, puede seguir algún formato de archivo de plantilla y aún así ejecutar cualquier cosa que desee. Por ejemplo:
>>>from os import cpu_count
>>>eval(''[1,cores]'', {''__builtins__'': None}, {''cores'': cpu_count()})
[1, 8]
Tal vez un ejemplo engañoso de leer una línea e interpretarla.
Pruebe eval(input())
y escriba "1+1"
; esto debería imprimir 2
. Evalúa evalúa expresiones.
Una de las aplicaciones útiles de eval()
es evaluar expresiones de python a partir de una cadena. Por ejemplo, carga desde la cadena de archivos de la representación del diccionario:
running_params = {"Greeting":"Hello "}
fout = open("params.dat",''w'')
fout.write(repr(running_params))
fout.close()
Léalo como una variable y edítelo:
fin = open("params.dat",''r'')
diction=eval(fin.read())
diction["Greeting"]+="world"
fin.close()
print diction
Salida:
{''Greeting'': ''Hello world''}
eval()
, como su nombre indica, evalúa el argumento pasado.
raw_input()
ahora es input()
en las versiones de python 3.x. Entonces, el ejemplo más comúnmente encontrado para el uso de eval()
es su uso para proporcionar la funcionalidad que input()
proporcionó en la versión 2.x de python. raw_input devolvió los datos ingresados por el usuario como una cadena, mientras que la entrada evaluó el valor de los datos ingresados y los devolvió.
eval(input("bla bla"))
replica la funcionalidad de input()
en 2.x, es decir, de evaluar los datos ingresados por el usuario.
En resumen: eval()
evalúa los argumentos pasados y, por lo tanto, eval(''1 + 1'')
devolvió 2.
eval()
evalúa la cadena pasada como una expresión de Python y devuelve el resultado. Por ejemplo, eval("1 + 1")
interpreta y ejecuta la expresión "1 + 1"
y devuelve el resultado (2).
Una de las razones por las que podría confundirse es porque el código que citó implica un nivel de direccionamiento indirecto. La función de llamada interna (entrada) se ejecuta primero, por lo que el usuario ve el indicador "blah". Imaginemos que responden con "1 + 1" (se agregan citas para mayor claridad, no las escriba al ejecutar su programa), la función de entrada devuelve esa cadena, que luego se pasa a la función externa (eval) que interpreta la cadena y devuelve el resultado (2).
Lea más sobre eval here .
eval()
interpreta una cadena como código. La razón por la que tantas personas le han advertido sobre el uso de esto es porque un usuario puede usar esto como una opción para ejecutar código en la computadora. Si tiene eval(input())
y os
importado, una persona podría escribir input()
os.system(''rm -R *'')
que eliminaría todos sus archivos en su directorio de inicio. (Suponiendo que tienes un sistema Unix). Usar eval()
es un agujero de seguridad. Si necesita convertir cadenas a otros formatos, intente usar cosas que hagan eso, como int()
.