Metoden eval () analyserer uttrykket som sendes til denne metoden og kjører pythonuttrykk (kode) i programmet.
Enkelt sagt eval()
kjører funksjonen python-koden (som sendes som et argument) i programmet.
Syntaksen for eval()
er:
eval (uttrykk, globaler = ingen, lokalbefolkningen = ingen)
eval () Parametere
Den eval()
funksjonen tar tre parametere:
- uttrykk - strengen analysert og evaluert som et Python-uttrykk
- globaler (valgfritt) - en ordbok
- lokale (valgfritt) - et kartleggingsobjekt. Ordbok er standard og ofte brukt kartleggingstype i Python.
Bruk av globaler og lokalbefolkningen vil bli diskutert senere i denne artikkelen.
Returverdi fra eval ()
Metoden eval () returnerer resultatet evaluert fra uttrykket.
Eksempel 1: Hvordan eval () fungerer i Python
x = 1 print(eval('x + 1'))
Produksjon
2
Her eval()
evaluerer funksjonen uttrykket x + 1
og print
brukes til å vise denne verdien.
Eksempel 2: Praktisk eksempel for å demonstrere bruk av 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
Produksjon
Skriv inn en funksjon: beregneArea (l) Hvis lengden er 1, Areal = 1 Hvis lengden er 2, Areal = 4 Hvis lengden er 3, Areal = 9 Hvis lengden er 4, Areal = 16
Advarsler når du bruker eval ()
Vurder en situasjon der du bruker et Unix-system (macOS, Linux osv.) Og du har importert os
modulen. OS-modulen gir en bærbar måte å bruke operativsystemfunksjoner som å lese eller skrive til en fil.
Hvis du tillater brukerne å legge inn en verdi med eval(input())
, kan brukeren gi kommandoer til endring fil eller slette alle filer ved hjelp av kommandoen: os.system('rm -rf *')
.
Hvis du bruker eval(input())
koden din, er det lurt å sjekke hvilke variabler og metoder brukeren kan bruke. Du kan se hvilke variabler og metoder som er tilgjengelige ved hjelp av dir () -metoden.
from math import * print(eval('dir()'))
Produksjon
('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' kam ',' copysign ',' cos ',' cosh ',' grader ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', '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 ',' radians ',' rest ',' sin ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')
Begrensning av bruken av tilgjengelige metoder og variabler i eval ()
Oftere enn ikke, alle tilgjengelige metoder og variabler som brukes i uttrykket (første parameter til eval()
), er kanskje ikke nødvendig, eller til og med et sikkerhetshull. Du må kanskje begrense bruken av disse metodene og variablene for eval()
. Du kan gjøre det ved å overføre valgfrie globaler og lokale parametere (ordbøker) til eval()
funksjonen.
1. Når både globale og lokale parametere er utelatt
Hvis begge parametrene er utelatt (som i våre tidligere eksempler), blir uttrykket utført i gjeldende omfang. Du kan sjekke tilgjengelige variabler og metoder ved hjelp av følgende kode:
print(eval('dir()')
2. Passing globals parameter; lokale parameter er utelatt
Globale og lokale parametere (ordbøker) brukes til henholdsvis globale og lokale variabler. Hvis lokalordboken er utelatt, er den som standard global ordbok. Betydning, globaler vil bli brukt for både globale og lokale variabler.
Merk: Du kan sjekke den nåværende globale og lokale ordboken i Python ved å bruke henholdsvis globals () og lokale () innebygde metoder.
Eksempel 3: Passer tom ordbok som globalparameter
from math import * print(eval('dir()', ())) # The code will raise an exception print(eval('sqrt(25)', ()))
Produksjon
('__builtins__') Sporing (siste anrop sist): Fil "", linje 5, på trykk (eval ('sqrt (25)', ())) Fil "", linje 1, i NameError: navn 'sqrt' er ikke definert
Hvis du sender en tom ordbok som globaler, er bare de __builtins__
tilgjengelige for expression
(første parameter til eval()
).
Selv om vi har importert math
modulen i ovennevnte program, kan ikke uttrykk få tilgang til noen funksjoner levert av matematikkmodulen.
Eksempel 4: Gjøre visse metoder tilgjengelige
from math import * print(eval('dir()', ('sqrt': sqrt, 'pow': pow)))
Produksjon
('__builtins__', 'pow', 'sqrt')
Her kan uttrykket bare bruke sqrt()
og og pow()
metodene sammen med __builtins__
.
Det er også mulig å endre navnet på metoden som er tilgjengelig for uttrykket etter ønske:
from math import * names = ('square_root': sqrt, 'power': pow) print(eval('dir()', names)) # Using square_root in Expression print(eval('square_root(9)', names))
Produksjon
('__builtins__', 'power', 'square_root') 3.0
I programmet ovenfor square_root()
beregner du kvadratroten ved hjelp av sqrt()
. Å prøve å bruke sqrt()
direkte vil imidlertid føre til en feil.
Eksempel 5: Begrensning av bruken av innebygde moduler
Du kan begrense bruken av __builtins__
i uttrykket som følger:
eval(expression, ('__builtins__': None))
3. Passerer både global og lokal ordbok
Du kan gjøre nødvendige funksjoner og variabler tilgjengelige for bruk ved å sende lokalbefolkningen ordbok. For eksempel:
from math import * a = 169 print(eval('sqrt(a)', ('__builtins__': None), ('a': a, 'sqrt': sqrt)))
Produksjon
13.0
I dette programmet kan uttrykk bare ha sqrt()
metode og variabel a. Alle andre metoder og variabler er utilgjengelige.
Å begrense bruken av eval()
forbipasserende globaler og lokale ordbøker vil gjøre koden din sikker, spesielt når du bruker inndata fra brukeren til eval()
metoden.
Merk: Noen ganger eval()
er det ikke sikkert selv med begrensede navn. Når et objekt og dets metoder blir gjort tilgjengelige, kan nesten alt gjøres. Den eneste sikre måten er å validere brukerinngangen.