Saltar al contenido

¿Qué hace la función eval() de Python?

Estuvimos investigando en el mundo on line y así tener para ti la solución a tu problema, si continúas con inquietudes deja la inquietud y te contestamos con mucho gusto.

Solución:

La función eval permite que un programa Python ejecute código Python dentro de sí mismo.

ejemplo de eval (shell interactivo):

>>> x = 1
>>> eval('x + 1')
2
>>> eval('x')
1

eval() interpreta un string como código. La razón por la que tanta gente le ha advertido sobre el uso de esto es porque un usuario puede usarlo como una opción para ejecutar código en la computadora. Si usted tiene eval(input()) y os importado, una persona podría escribir en input()os.system('rm -R *') que eliminaría todos sus archivos en su directorio de inicio. (Suponiendo que tiene un sistema Unix). Utilizando eval() es un agujero de seguridad. Si necesita convertir cadenas a otros formatos, intente usar cosas que hagan eso, como int().

Muchas buenas respuestas aquí, pero ninguna describe el uso de eval() en el contexto de su globals y locals kwargs, es decir eval(expression, globals=None, locals=None) (ver documentos para eval aquí).

Estos se pueden utilizar para limitar las funciones que están disponibles a través del eval función. Por ejemplo, si carga un nuevo intérprete de python, el locals() y globals() será el mismo y se verá algo como esto:

>>>globals()
'__loader__': , '__doc__': None,
 '__spec__': None, '__builtins__': ,
 '__package__': None, '__name__': '__main__'

Ciertamente hay funciones dentro de la builtins módulo que puede causar un daño significativo a un sistema. Pero es posible bloquear cualquier cosa y todo lo que no queremos que esté disponible. Tomemos un ejemplo. Digamos que queremos construir una lista para representar un dominio de los núcleos disponibles en un sistema. Para mi tengo 8 cores asi que me gustaria una lista [1, 8].

>>>from os import cpu_count
>>>eval('[1, cpu_count()]')
[1, 8]

Así mismo todos __builtins__ está disponible.

>>>eval('abs(-1)')
1

Está bien. Ahí vemos una función que queremos exponer y un ejemplo de un método (de muchos que pueden ser mucho más complejos) que no queremos exponer. Así que bloqueemos todo.

>>>eval('[1, cpu_count()]', '__builtins__':None, )
TypeError: 'NoneType' object is not subscriptable

Hemos bloqueado efectivamente todos los __builtins__ funciones y como tal trajo un nivel de protección a nuestro sistema. En este punto, podemos comenzar a agregar funciones que queremos 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 cpu_count función disponible sin dejar de bloquear todo lo que no queremos. En mi opinión, esto es súper poderoso y claramente desde el alcance de las otras respuestas, no es una implementación común. Hay numerosos usos para algo como esto y mientras se maneje correctamente, personalmente siento eval se puede utilizar con seguridad a gran valor.

nótese bien

Algo más que es genial acerca de estos kwargs es que puedes empezar a usar abreviaturas para tu código. Supongamos que usa eval como parte de una canalización para ejecutar algún texto importado. El texto no necesita tener un código exacto, puede seguir algún formato de archivo de plantilla y aun así ejecutar cualquier cosa que desee. Por ejemplo:

>>>from os import cpu_count
>>>eval('[1,cores]', '__builtins__': None, 'cores': cpu_count())
[1, 8]

Calificaciones y comentarios

Al final de la artículo puedes encontrar las explicaciones de otros programadores, tú igualmente tienes la habilidad insertar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *