English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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)
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.
Il metodo eval() restituisce daespressioneRisultato dell'evaluazione.
x = 1 print(eval('x + 1'))
Quando si esegue questo programma, l'output è:
2
Qui, eval() calcola l'espressione x + 1 e la stampa.
# 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
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
通常,可能不需要使用Espressione(eval()的第一个参数)中使用的所有可用方法和变量,甚至可能有安全漏洞。您可能需要限制将这些方法和变量用于eval()。您可以通过将可选的globalselocals参数(字典)传递给eval()方法来实现。
如果两个参数都被省略(如前面的示例所示),则在当前范围内执行该Espressione。您可以使用以下代码检查可用的变量和方法:
print(eval('dir()'))
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.
Puoi limitare __builtins__ nel modo seguente:Espressione(expression)di seguito:
utilizzo di eval(expression, {'__builtins__': None})
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().