Metode eval () parsē šai metodei nodoto izteiksmi un programmas ietvaros palaiž pitona izteiksmi (kodu).
Vienkārši sakot, eval()
funkcija palaiž pitona kodu (kas tiek nodots kā arguments) programmā.
Sintakse eval()
ir:
eval (izteiksme, globāļi = nav, vietējie = nav)
eval () parametri
eval()
Funkcija ir trīs parametri:
- izteiksme - virkne parsēta un novērtēta kā Python izteiksme
- globāls (pēc izvēles) - vārdnīca
- vietējie (pēc izvēles) - kartēšanas objekts. Vārdnīca ir standarta un parasti izmantots kartēšanas veids Python.
Globālo un vietējo iedzīvotāju izmantošana tiks aplūkota vēlāk šajā rakstā.
Atgriezeniskā vērtība no eval ()
Metode eval () atgriež rezultātu, kas novērtēts no izteiksmes.
1. piemērs: Kā darbojas eval () Python
x = 1 print(eval('x + 1'))
Rezultāts
2
Šeit eval()
funkcija novērtē izteiksmi x + 1
un print
tiek izmantota šīs vērtības parādīšanai.
2. piemērs: praktisks piemērs, lai parādītu eval () izmantošanu
# 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
Rezultāts
Ierakstiet funkciju: aprēķiniet laukumu (l) Ja garums ir 1, Platība = 1 Ja garums ir 2, Platība = 4 Ja garums ir 3, Platība = 9 Ja garums ir 4, Platība = 16
Brīdinājumi, lietojot eval ()
Apsveriet situāciju, kad izmantojat Unix sistēmu (macOS, Linux utt.) Un esat importējis os
moduli. OS modulis nodrošina pārnēsājamu veidu, kā izmantot operētājsistēmas funkcijas, piemēram, lasīšanu vai rakstīšanu failā.
Ja jums ļauj lietotājiem ievadīt vērtību, izmantojot eval(input())
, lietotājs var izdot komandas, lai mainītu failu vai pat izdzēst visus failus, izmantojot komandu: os.system('rm -rf *')
.
Ja izmantojat eval(input())
kodu, ieteicams pārbaudīt, kādus mainīgos un metodes lietotājs var izmantot. Izmantojot dir () metodi, jūs varat redzēt, kuri mainīgie un metodes ir pieejami.
from math import * print(eval('dir()'))
Rezultāts
('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' griesti ',' ķemme ',' kopiju dizains ',' cos ',' cosh ',' grādi ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hipot', ' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radians ',' atlikums ',' grēks ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')
Pieejamo metožu un mainīgo izmantošanas ierobežošana eval ()
Bieži vien visas izteiksmē (pirmais parametrs līdz eval()
) izmantotās pieejamās metodes un mainīgie var nebūt vajadzīgi vai pat var būt ar drošības caurumu. Jums var būt jāierobežo šo metožu un mainīgo izmantošana eval()
. To var izdarīt, nododot funkcijai izvēles globālos un lokālos parametrus (vārdnīcas) eval()
.
1. Kad tiek izlaisti gan globālie, gan vietējie parametri
Ja abi parametri tiek izlaisti (tāpat kā mūsu iepriekšējos piemēros), izteiksme tiek izpildīta pašreizējā darbības jomā. Pieejamos mainīgos un metodes varat pārbaudīt, izmantojot šādu kodu:
print(eval('dir()')
2. Globālā parametra nodošana; vietējo parametrs nav norādīts
Globālajiem un lokālajiem parametriem (vārdnīcām) tiek izmantoti attiecīgi globālie un lokālie mainīgie. Ja vietējo vārdnīca ir izlaista, tā pēc noklusējuma ir globālā vārdnīca. Nozīme, globālie tiks izmantoti gan globālajiem, gan lokālajiem mainīgajiem.
Piezīme. Pašreizējo globālo un lokālo vārdnīcu Python varat pārbaudīt, izmantojot attiecīgi globals () un localals () iebūvētās metodes.
3. piemērs: Tukšās vārdnīcas kā globālā parametra nodošana
from math import * print(eval('dir()', ())) # The code will raise an exception print(eval('sqrt(25)', ()))
Rezultāts
('__builtins__') Traceback (pēdējais zvans pēdējais): Fails "", 5. rinda, drukātā veidā (eval ('sqrt (25)', ())) File "", 1. rindiņa, NameError: nosaukums 'sqrt' nav definēts
Ja jūs nododat tukšu vārdnīcu kā globālo, __builtins__
ir pieejamas tikai tās expression
(pirmais parametrs eval()
).
Lai gan mēs esam importējuši math
moduli iepriekš minētajā programmā, izteiksme nevar piekļūt nevienai matemātikas moduļa nodrošinātai funkcijai.
4. piemērs: Dažu metožu pieejamība
from math import * print(eval('dir()', ('sqrt': sqrt, 'pow': pow)))
Rezultāts
('__builtins__', 'pow', 'sqrt')
Šeit izteiksmē var izmantot tikai sqrt()
un pow()
metodes kopā ar __builtins__
.
Tāpat ir iespējams mainīt izteicienam pieejamās metodes nosaukumu pēc jūsu vēlmes:
from math import * names = ('square_root': sqrt, 'power': pow) print(eval('dir()', names)) # Using square_root in Expression print(eval('square_root(9)', names))
Rezultāts
('__builtins__', 'power', 'square_root') 3.0
Iepriekš minētajā programmā square_root()
aprēķina kvadrātsakni, izmantojot sqrt()
. Tomēr mēģinājums izmantot sqrt()
tieši radīs kļūdu.
5. piemērs: iebūvēto ierīču izmantošanas ierobežošana
Varat ierobežot __builtins__
izteiksmes lietošanu šādi:
eval(expression, ('__builtins__': None))
3. Gan globālās, gan vietējās vārdnīcas nodošana
Nepieciešamās funkcijas un mainīgos varat padarīt pieejamus, nododot vietējo vārdnīcu. Piemēram:
from math import * a = 169 print(eval('sqrt(a)', ('__builtins__': None), ('a': a, 'sqrt': sqrt)))
Rezultāts
13.0
Šajā programmā izteiksmei var būt tikai sqrt()
metode un mainīgais a. Visas citas metodes un mainīgie nav pieejami.
Ierobežojot to, eval()
ka garām iet globālās un vietējās vārdnīcas, kods būs drošs, it īpaši, ja izmantojat lietotāja ievadīto eval()
metodi.
Piezīme. Dažreiz eval()
tas nav drošs pat ar ierobežotiem nosaukumiem. Kad objekts un tā metodes ir pieejamas, var izdarīt gandrīz visu. Vienīgais drošais veids ir validēt lietotāja ievadi.