Python eval ()

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 + 1og printbrukes 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 osmodulen. 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 mathmodulen 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.

Interessante artikler...