Python eval ()

El método eval () analiza la expresión pasada a este método y ejecuta la expresión (código) de Python dentro del programa.

En términos simples, la eval()función ejecuta el código Python (que se pasa como argumento) dentro del programa.

La sintaxis de eval()es:

 eval (expresión, globales = Ninguno, locales = Ninguno)

Eval () Parámetros

La eval()función toma tres parámetros:

  • expresión : la cadena analizada y evaluada como una expresión de Python
  • globals (opcional) - un diccionario
  • locales (opcional): un objeto de mapeo. El diccionario es el tipo de mapeo estándar y comúnmente utilizado en Python.

El uso de globales y locales se discutirá más adelante en este artículo.

Valor de retorno de eval ()

El método eval () devuelve el resultado evaluado de la expresión.

Ejemplo 1: cómo funciona eval () en Python

 x = 1 print(eval('x + 1'))

Salida

 2

Aquí, la eval()función evalúa la expresión x + 1y printse usa para mostrar este valor.

Ejemplo 2: Ejemplo práctico para demostrar el uso de eval ()

 # Perimeter of Square def calculatePerimeter(l): return 4*l # Area of Square def calculateArea(l): return l*l expression = input("Type a function: ") for l in range(1, 5): if (expression == 'calculatePerimeter(l)'): print("If length is ", l, ", Perimeter = ", eval(expression)) elif (expression == 'calculateArea(l)'): print("If length is ", l, ", Area = ", eval(expression)) else: print('Wrong Function') break

Salida

 Escriba una función: calculateArea (l) Si la longitud es 1, Área = 1 Si la longitud es 2, Área = 4 Si la longitud es 3, Área = 9 Si la longitud es 4, Área = 16

Advertencias al usar eval ()

Considere una situación en la que está utilizando un sistema Unix (macOS, Linux, etc.) y ha importado el osmódulo. El módulo del sistema operativo proporciona una forma portátil de utilizar las funciones del sistema operativo, como leer o escribir en un archivo.

Si usted permite a los usuarios introducir un valor utilizando eval(input()), el usuario puede enviar comandos al archivo de cambio o incluso borrar todos los archivos con el comando: os.system('rm -rf *').

Si está utilizando eval(input())en su código, es una buena idea comprobar qué variables y métodos puede utilizar el usuario. Puede ver qué variables y métodos están disponibles usando el método dir ().

 from math import * print(eval('dir()'))

Salida

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' comb ',' copysign ',' cos ',' cosh ',' grados ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'piso', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', ' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radianes ',' resto ',' sin ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')

Restringir el uso de métodos y variables disponibles en eval ()

La mayoría de las veces, es eval()posible que no se necesiten todos los métodos y variables disponibles que se utilizan en la expresión (primer parámetro a ), o incluso que tengan un agujero de seguridad. Es posible que deba restringir el uso de estos métodos y variables para eval(). Puede hacerlo pasando parámetros globales y locales opcionales (diccionarios) a la eval()función.

1. Cuando se omiten los parámetros globales y locales

Si se omiten ambos parámetros (como en nuestros ejemplos anteriores), la expresión se ejecuta en el ámbito actual. Puede verificar las variables y métodos disponibles usando el siguiente código:

 print(eval('dir()')

2. Paso de parámetro global; se omite el parámetro locals

The globals and locals parameters (dictionaries) are used for global and local variables respectively. If the locals dictionary is omitted, it defaults to globals dictionary. Meaning, globals will be used for both global and local variables.

Note: You can check the current global and local dictionary in Python using globals() and locals() built-in methods respectively.

Example 3: Passing empty dictionary as globals parameter

 from math import * print(eval('dir()', ())) # The code will raise an exception print(eval('sqrt(25)', ()))

Output

 ('__builtins__') Traceback (most recent call last): File "", line 5, in print(eval('sqrt(25)', ())) File "", line 1, in NameError: name 'sqrt' is not defined

If you pass an empty dictionary as globals, only the __builtins__ are available to expression (first parameter to the eval()).

Even though we have imported the math module in the above program, expression can't access any functions provided by the math module.

Example 4: Making Certain Methods available

 from math import * print(eval('dir()', ('sqrt': sqrt, 'pow': pow)))

Output

 ('__builtins__', 'pow', 'sqrt')

Here, the expression can only use the sqrt() and the pow() methods along with __builtins__.

It is also possible to change the name of the method available for the expression as to your wish:

 from math import * names = ('square_root': sqrt, 'power': pow) print(eval('dir()', names)) # Using square_root in Expression print(eval('square_root(9)', names))

Output

 ('__builtins__', 'power', 'square_root') 3.0

In the above program, square_root() calculates the square root using sqrt(). However, trying to use sqrt() directly will raise an error.

Example 5: Restricting the Use of built-ins

You can restrict the use of __builtins__ in the expression as follows:

 eval(expression, ('__builtins__': None))

3. Pasar el diccionario local y global

Puede hacer que las funciones y variables necesarias estén disponibles para su uso pasando el diccionario local. Por ejemplo:

 from math import * a = 169 print(eval('sqrt(a)', ('__builtins__': None), ('a': a, 'sqrt': sqrt)))

Salida

 13,0

En este programa, la expresión solo puede tener un sqrt()método y una variable. Todos los demás métodos y variables no están disponibles.

Restringir el uso de eval()mediante el paso de diccionarios globales y locales hará que su código sea seguro, especialmente cuando utilice la entrada proporcionada por el usuario al eval()método.

Nota: A veces, eval()no es seguro incluso con nombres limitados. Cuando se hace accesible un objeto y sus métodos, se puede hacer casi cualquier cosa. La única forma segura es validando la entrada del usuario.

Articulos interesantes...