Python eval ()

Metoden eval () analyserer det udtryk, der sendes til denne metode, og kører pythonekspression (kode) i programmet.

Enkelt sagt eval()kører funktionen python-koden (som sendes som et argument) inden for programmet.

Syntaksen for eval()er:

 eval (udtryk, globaler = ingen, lokale = ingen)

eval () Parametre

Den eval()funktion tager tre parametre:

  • udtryk - strengen analyseret og evalueret som et Python-udtryk
  • globaler (valgfrit) - en ordbog
  • lokale (valgfrit) - et kortlægningsobjekt. Ordbog er den almindelige og almindeligt anvendte kortlægningstype i Python.

Brug af globaler og lokale diskuteres senere i denne artikel.

Returneringsværdi fra eval ()

Metoden eval () returnerer det evaluerede resultat fra udtrykket.

Eksempel 1: Hvordan eval () fungerer i Python

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

Produktion

 2

Her eval()evaluerer funktionen udtrykket x + 1og printbruges til at vise denne værdi.

Eksempel 2: Praktisk eksempel til demonstration af brug af 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

Produktion

 Indtast en funktion: beregneArea (l) Hvis længden er 1, Areal = 1 Hvis længden er 2, Areal = 4 Hvis længden er 3, Areal = 9 Hvis længden er 4, Areal = 16

Advarsler ved brug af eval ()

Overvej en situation, hvor du bruger et Unix-system (macOS, Linux osv.), Og du har importeret osmodulet. OS-modulet giver en bærbar måde at bruge operativsystemfunktioner som at læse eller skrive til en fil.

Hvis du tillader brugere at indtaste en værdi ved hjælp eval(input()), kan brugeren udstede kommandoer til forandring fil eller endda slette alle filer ved hjælp af kommandoen: os.system('rm -rf *').

Hvis du bruger eval(input())din kode, er det en god ide at kontrollere, hvilke variabler og metoder brugeren kan bruge. Du kan se, hvilke variabler og metoder der er tilgængelige ved hjælp af dir () -metoden.

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

Produktion

('__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')

Begrænsning af brugen af ​​tilgængelige metoder og variabler i eval ()

Oftere end ikke er alle de tilgængelige metoder og variabler, der bruges i udtrykket (første parameter til eval()) muligvis ikke nødvendige, eller måske endda et sikkerhedshul. Det kan være nødvendigt at begrænse brugen af ​​disse metoder og variabler til eval(). Du kan gøre det ved at overføre valgfri globaler og lokale parametre (ordbøger) til eval()funktionen.

1. Når både globale og lokale parametre er udeladt

Hvis begge parametre er udeladt (som i vores tidligere eksempler), udføres udtrykket i det aktuelle omfang. Du kan kontrollere de tilgængelige variabler og metoder ved hjælp af følgende kode:

 print(eval('dir()')

2. Passerende globalsparameter; lokale parameter er udeladt

Globale og lokale parametre (ordbøger) bruges til henholdsvis globale og lokale variabler. Hvis lokalordbogen er udeladt, er den som standard global ordbog. Betydning, globaler vil blive brugt til både globale og lokale variabler.

Bemærk: Du kan kontrollere den aktuelle globale og lokale ordbog i Python ved hjælp af henholdsvis globals () og locals () indbyggede metoder.

Eksempel 3: At sende tom ordbog som globalparameter

 from math import * print(eval('dir()', ())) # The code will raise an exception print(eval('sqrt(25)', ()))

Produktion

 ('__builtins__') Traceback (seneste opkald sidst): Fil "", linje 5, i tryk (eval ('sqrt (25)', ())) File "", linje 1, i NameError: navn 'sqrt' er ikke defineret

Hvis du sender en tom ordbog som globaler, er kun de __builtins__tilgængelige for expression(første parameter til eval()).

Selvom vi har importeret mathmodulet i ovenstående program, kan udtryk ikke få adgang til nogen funktioner leveret af matematikmodulet.

Eksempel 4: Gør visse metoder tilgængelige

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

Produktion

 ('__builtins__', 'pow', 'sqrt')

Her kan udtrykket kun bruge sqrt()og og pow()metoderne sammen med __builtins__.

Det er også muligt at ændre navnet på den tilgængelige metode til udtrykket efter dit ø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))

Produktion

 ('__builtins__', 'power', 'square_root') 3.0

I ovenstående program square_root()beregner kvadratroden ved hjælp af sqrt(). At prøve at bruge sqrt()direkte vil dog medføre en fejl.

Eksempel 5: Begrænsning af brugen af ​​indbyggede

Du kan begrænse brugen af __builtins__i udtrykket som følger:

 eval(expression, ('__builtins__': None))

3. Passerer både global og lokal ordbog

Du kan stille de nødvendige funktioner og variabler til rådighed til brug ved at passere lokalordbogen. For eksempel:

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

Produktion

 13.0

I dette program kan udtryk kun have sqrt()metode og variabel a. Alle andre metoder og variabler er ikke tilgængelige.

Begrænsning af brugen af eval()forbipasserende globaler og lokale ordbøger vil gøre din kode sikker, især når du bruger input fra brugeren til eval()metoden.

Bemærk: Nogle gange eval()er det ikke sikkert, selv med begrænsede navne. Når et objekt og dets metoder gøres tilgængelige, kan næsten alt gøres. Den eneste sikre måde er ved at validere brugerindgangen.

Interessante artikler...