Conoce en detalle la función eval() de Python

¡Hola! Hoy vamos a explorar en detalle la función `eval()` de Python, una herramienta poderosa y, a veces, controvertida debido a sus capacidades y riesgos. Entender cómo funciona `eval()`, cuándo es adecuado usarla, y cómo hacerlo de manera segura es esencial para cualquier desarrollador de Python.


Introducción

La función `eval()` en Python toma una cadena de texto y la evalúa como una expresión de Python, devolviendo el resultado de esa evaluación. Esto significa que puedes pasar cualquier código Python que represente una expresión a `eval()` y Python lo ejecutará y devolverá su resultado. Sin embargo, debido a su capacidad para ejecutar código dinámicamente, `eval()` también puede ser peligrosa si no se usa con cuidado, especialmente si se evalúan entradas proporcionadas por el usuario.


En este artículo, te explicaré cómo funciona `eval()`, te mostraré ejemplos de su uso, discutiré los riesgos asociados con su uso, y te proporcionaré estrategias para utilizarla de manera segura.



1. ¿Qué es `eval()`?

La función `eval()` es una función incorporada en Python que evalúa una expresión en una cadena de texto y devuelve el resultado de esa evaluación. La sintaxis básica es:


eval(expresion, globals=None, locals=None)


Parámetros de `eval()`:

- `expresion`: Una cadena de texto que contiene la expresión que se evaluará. Esta expresión debe ser válida en Python y puede incluir operaciones matemáticas, llamadas a funciones, y más.

- `globals` (opcional): Un diccionario que define el entorno global en el que se evaluará la expresión.

- `locals` (opcional): Un diccionario que define el entorno local en el que se evaluará la expresión.


Ejemplo Básico

expresion = "2 + 3 * 5"

resultado = eval(expresion)

print(resultado) # Salida: 17



En este ejemplo, `eval()` evalúa la expresión `"2 + 3 * 5"` y devuelve el resultado, que es `17`.



2. Usos Comunes de `eval()`

2.1 Calculadora Simple

Uno de los usos más comunes de `eval()` es en la creación de calculadoras simples que evalúan expresiones matemáticas introducidas por el usuario.


expresion = input("Introduce una expresión matemática: ")

resultado = eval(expresion)

print(f"El resultado es: {resultado}")



2.2 Evaluar Expresiones Dinámicas

A veces, en un programa es necesario evaluar expresiones generadas dinámicamente. `eval()` permite hacer esto de manera directa.


x = 10

expresion = "x * 2 + 5"

resultado = eval(expresion)

print(resultado) # Salida: 25



2.3 Acceder a Variables y Funciones Dinámicamente

`eval()` también se puede utilizar para acceder a variables y funciones cuyos nombres no se conocen hasta el tiempo de ejecución.


def saludar():

  return "¡Hola, Mundo!"


funcion_a_ejecutar = "saludar()"

resultado = eval(funcion_a_ejecutar)

print(resultado) # Salida: ¡Hola, Mundo!



3. Riesgos Asociados con `eval()`

El uso de `eval()` puede ser peligroso si no se maneja con cuidado. La razón principal es que `eval()` ejecuta cualquier código que se le pase como cadena, lo que puede llevar a la ejecución de código malicioso si la entrada no está controlada.



3.1 Inyección de Código

Uno de los riesgos más graves es la inyección de código, donde un atacante puede inyectar y ejecutar código arbitrario a través de la entrada de usuario.


entrada_usuario = "os.system('rm -rf /')" # Ejemplo de inyección de código malicioso

eval(entrada_usuario) # ¡Esto podría borrar todos los archivos si se ejecuta en un sistema Linux!



3.2 Acceso a Variables y Funciones Sensibles

`eval()` puede acceder y modificar variables y funciones en el entorno global o local, lo que podría exponer datos sensibles o permitir modificaciones no deseadas.


x = 5

eval("x + 10") # Esto funciona, pero también podría usarse para modificar 'x' o acceder a otros datos.



4. Uso Seguro de `eval()`

Dado el potencial de peligro, es importante saber cómo usar `eval()` de manera segura.



4.1 Limitar el Entorno Global y Local

Puedes controlar qué variables y funciones están disponibles para la expresión que `eval()` evaluará utilizando los parámetros `globals` y `locals`.


seguro_globals = {"__builtins__": None} # Desactivar las funciones incorporadas

seguro_locals = {"x": 10}


resultado = eval("x * 2 + 5", seguro_globals, seguro_locals)

print(resultado) # Salida: 25



4.2 Validar y Sanitizar Entradas

Antes de pasar cualquier cadena a `eval()`, es esencial validar y sanitizar la entrada para asegurarte de que solo contiene contenido seguro.



4.3 Considerar Alternativas a `eval()`

En muchos casos, es posible que no necesites usar `eval()` en absoluto. En su lugar, considera:


- `int()`, `float()` para convertir entradas numéricas.

- `ast.literal_eval()` de la biblioteca `ast`, que es más segura ya que solo evalúa literales seguros, como números, cadenas, tuplas, listas, dicts, booleans y `None`.


import ast


seguro_resultado = ast.literal_eval("['Python', 3.8]")

print(seguro_resultado) # Salida: ['Python', 3.8]



5. Ejemplos de `eval()` en Contextos Seguros

5.1 Usar `eval()` con Funciones Matemáticas Controladas

import math


def calcular_expresion(expresion):

  seguro_globals = {"__builtins__": None, "math": math}

  return eval(expresion, seguro_globals)


resultado = calcular_expresion("math.sqrt(16) + math.pow(2, 3)")

print(resultado) # Salida: 12.0



5.2 Evaluar Expresiones en Aplicaciones Controladas

En aplicaciones donde el control del entorno es total, `eval()` puede ser usado para interpretar expresiones matemáticas o de otro tipo.


def calcular(expresion):

  try:

    resultado = eval(expresion, {"__builtins__": None}, {})

    return resultado

  except Exception as e:

    return f"Error: {e}"


expresion = "2 + 3 * (5 / 2)"

print(calcular(expresion)) # Salida: 9.5



¡Entonces `eval()` tiene mucho para dar!

La función `eval()` es una herramienta poderosa que permite ejecutar expresiones Python desde una cadena de texto. Sin embargo, con gran poder viene una gran responsabilidad. Si bien esta función puede ser extremadamente útil en ciertos casos, también conlleva riesgos significativos, especialmente cuando se maneja entrada del usuario.


Al usar `eval()`, siempre debes considerar alternativas más seguras y, si decides usarla, debes hacerlo de manera controlada, limitando el entorno en el que se evalúa la expresión y validando cuidadosamente las entradas. 


¡Espero que este artículo te haya ayudado a comprender mejor la función para evaluaciones de Python y cómo usarla de manera segura! ¡Feliz programación!




Hay mucho más contenido sobre Python para ti


Puedes conocer todo el contenido que comparto en mi perfil de LinkedIn


Puedes descargar GRATIS mi manual completo en pdf de Python Rápido


image


This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.