English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial di base di Python

Controllo dei flussi di Python

Funzione di Python

Tipi di dati di Python

Operazioni di file di Python

Oggetti e classi di Python

Data e ora di Python

Conoscenze avanzate di Python

Manuale di riferimento di Python

Utilizzo e esempio di eval() in Python

Funzioni incorporate di Python

Il metodo eval() analizza l'espressione passata al metodo e esegue l'espressione python (codice) nel programma.

In breve, il metodo eval() esegue codice python all'interno del programma (passato come parametro).

La sintassi di eval() è:

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

Parametri del metodo eval()

Il metodo eval() ha tre parametri:

  • espressione-Analizza e valuta come espressione Python la stringa

  • globalsOpzionale) - Dizionario

  • localsOpzionale) - Oggetto mappatura. I dizionari sono un tipo di mappatura standard utilizzato frequentemente in Python.

che verrà discusso in questo articolo.Variabile globale (globals)eLocaleVariabile (locals)utilizzo.

Valore restituito da eval()

Il metodo eval() restituisce daespressioneRisultato dell'evaluazione.

Esempio 1: come funziona eval() in Python?

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

Quando si esegue questo programma, l'output è:

2

Qui, eval() calcola l'espressione x + 1 e la stampa.

Esempio 2: dimostrazione dell'uso effettivo di eval()

# Perimetro del quadrato
def calculatePerimeter(l):
  return 4 * l
# Quadrato dell'area
def calculateArea(l):
  return l * 1
property = input("Inserisci la funzione da utilizzare: ")
for l in range(1, 5):
    if (property == 'calculatePerimeter(l)'):
        print("Se la lunghezza è ", l, ", ", "perimetro = ", eval(property))
    elif (property == 'calculateArea(l)'):
        print("Se la lunghezza è ", l, ", ", "area = ", eval(property))
    else:
      print('Funzione errata')
      break

L'output del programma sopra sarà:

Inserisci la funzione da utilizzare: calculatePerimeter(l)
Se la lunghezza è 1, il perimetro = 4
Se la lunghezza è 2, il perimetro = 8
Se la lunghezza è 3, il perimetro = 12
Se la lunghezza è 4, il perimetro = 16

Perché è necessario essere cauti quando si utilizza eval()?

Considera un caso in cui stai utilizzando un sistema Unix (macOS, Linux, ecc.) e hai importato il modulo os. Il modulo os fornisce un metodo portatile per utilizzare le funzionalità del sistema operativo, ad esempio: leggere o scrivere file.

Se l'utente è autorizzato a utilizzare eval(input()), può emettere comandi per modificare i file, persino utilizzare command per eliminare tutti i file os.system('rm -rf *').

Se eval(input()) viene utilizzato nel codice, è meglio controllare quali variabili e metodi possono essere utilizzati dall'utente. Puoi usareMetodo dir()Visualizza le variabili e i metodi disponibili.

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

Quando esegui il programma, l'output sarà simile a:

__annotations__, __builtins__, __doc__, __file__, __loader__, __name__, __package__, __spec__, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, copysign, cos, cosh, degrees, e, erf, erfc, exp, expm1, fabs, factorial, floor, fmod, frexp, fsum, gamma, gcd, hypot, inf, isclose, isfinite, isinf, isnan, ldexp, lgamma, log, log10, log1p, log2, modf, nan, pi, pow, radians, sin, sinh, sqrt, squareRoot, tan, tanh, tau, trunc

限制在eval()中使用可用的方法和变量

通常,可能不需要使用Espressione(eval()的第一个参数)中使用的所有可用方法和变量,甚至可能有安全漏洞。您可能需要限制将这些方法和变量用于eval()。您可以通过将可选的globalselocals参数(字典)传递给eval()方法来实现。

1.当省略globals和locals参数时

如果两个参数都被省略(如前面的示例所示),则在当前范围内执行该Espressione。您可以使用以下代码检查可用的变量和方法:

print(eval('dir()'))

2.传递全局参数;省略locals参数

globals和locals参数(字典),分别用于全局和局部变量。如果省略了locals字典,则默认为globals字典。这意味着,globals将用于全局变量和局部变量。

注意:您可以分别使用globals()elocals()内置方法在Python中检查当前的全局字典和局部字典。

将空字典作为全局参数传递

from math import *
print(eval('dir()', {}))
# 下面的代码将引发异常
# print(eval('sqrt(25)', {}))

如果将空字典作为globals传递,则仅__builtins__可用于表达式(expression)(eval()的第一个参数)。即使我们在上面的程序中导入了math模块,表达式(expression)也无法访问math模块提供的任何功能。

Quando si esegue questo programma, l'output è:

__builtins__

使某些方法可用

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

In questo, l'espressione può anche utilizzare i metodi sqrt() e pow() e __builtins__.

Inoltre, puoi modificare a tuo piacimento le funzioni e le variabili disponibili perEspressioneIl nome del metodo (espressione).

from math import *
print(eval('dir()', {'squareRoot': sqrt, 'pow': pow}))
# Usa la radice quadrata nell'espressione
print(eval('squareRoot(9)', {'squareRoot': sqrt, 'pow': pow}))

Nel programma sopra, squareRoot() calcola la radice quadrata (funzionalità simili a sqrt()). Ma l'uso di sqrt() causerà un errore.

Limitare l'uso di __builtins__

Puoi limitare __builtins__ nel modo seguente:Espressione(expression)di seguito:

utilizzo di eval(expression, {'__builtins__': None})

3. Attraverso dizionari globali e locali

Puoi passareLocale(locals) dizionari per rendere disponibili le funzioni e le variabili necessarie. Ad esempio:

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

Quando si esegue questo programma, l'output è:

 2.23606797749979

In questo programma,Espressione(espressione)(primo argomento di eval)può avere solo i metodi sqrt() e variabilia。Tutte le altre funzioni e variabili non sono disponibili.

tramite la trasmissioneglobalselocalsLimitare l'uso di eval() con dizionari può rendere il tuo codice sicuro, specialmente quando si utilizza l'input fornito dagli utenti al metodo eval().

Funzioni incorporate di Python