Python eval ()

De methode eval () parseert de expressie die aan deze methode is doorgegeven en voert de python-expressie (code) uit binnen het programma.

In eenvoudige bewoordingen eval()voert de functie de python-code uit (die als argument wordt doorgegeven) binnen het programma.

De syntaxis van eval()is:

 eval (uitdrukking, globals = None, locals = None)

eval () Parameters

De eval()functie heeft drie parameters:

  • expression - de tekenreeks die wordt geparseerd en geëvalueerd als een Python-expressie
  • globals (optioneel) - een woordenboek
  • locals (optioneel) - een mapping-object. Woordenboek is het standaard en meest gebruikte toewijzingstype in Python.

Het gebruik van globals en locals komt later in dit artikel aan de orde.

Retourwaarde van eval ()

De methode eval () retourneert het resultaat dat is geëvalueerd op basis van de uitdrukking.

Voorbeeld 1: hoe eval () werkt in Python

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

Uitvoer

 2

Hier eval()evalueert de functie de uitdrukking x + 1en printwordt deze gebruikt om deze waarde weer te geven.

Voorbeeld 2: Praktisch voorbeeld om het gebruik van eval () aan te tonen

 # 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

Uitvoer

 Typ een functie: berekenArea (l) Als lengte 1 is, Oppervlakte = 1 Als lengte 2 is, Oppervlakte = 4 Als lengte 3 is, Oppervlakte = 9 Als lengte 4 is, Oppervlakte = 16

Waarschuwingen bij gebruik van eval ()

Beschouw een situatie waarin u een Unix-systeem gebruikt (macOS, Linux enz.) En u de osmodule hebt geïmporteerd . De os-module biedt een draagbare manier om functies van het besturingssysteem te gebruiken, zoals lezen of schrijven naar een bestand.

Als u gebruikers in te voeren toestaan dat een waarde met behulp van eval(input()), kan de gebruiker commando's te geven aan verandering bestand of zelfs alle bestanden met de opdracht te verwijderen: os.system('rm -rf *').

Als u eval(input())in uw code gebruikt, is het een goed idee om te controleren welke variabelen en methoden de gebruiker kan gebruiken. U kunt zien welke variabelen en methoden beschikbaar zijn met de methode dir ().

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

Uitvoer

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' comb ',' copysign ',' cos ',' cosh ',' graden ',' 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 ',' radialen ',' rest ',' sin ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')

Het gebruik van beschikbare methoden en variabelen beperken in eval ()

Vaker wel dan niet zijn alle beschikbare methoden en variabelen die in de expressie worden gebruikt (eerste parameter tot eval()) misschien niet nodig, of hebben ze zelfs een beveiligingslek. Mogelijk moet u het gebruik van deze methoden en variabelen beperken voor eval(). U kunt dit doen door optionele globale en lokale parameters (woordenboeken) door te geven aan de eval()functie.

1. Wanneer zowel globale als lokale parameters zijn weggelaten

Als beide parameters worden weggelaten (zoals in onze eerdere voorbeelden), wordt de uitdrukking uitgevoerd in het huidige bereik. U kunt de beschikbare variabelen en methoden controleren met de volgende code:

 print(eval('dir()')

2. Globalsparameter doorgeven; locals parameter is weggelaten

De globale en lokale parameters (woordenboeken) worden gebruikt voor respectievelijk globale en lokale variabelen. Als het lokale woordenboek wordt weggelaten, wordt het standaard globaal woordenboek. Dit betekent dat globalen worden gebruikt voor zowel globale als lokale variabelen.

Opmerking: je kunt het huidige globale en lokale woordenboek in Python controleren met respectievelijk de ingebouwde methoden globals () en locals ().

Voorbeeld 3: leeg woordenboek doorgeven als parameter globals

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

Uitvoer

 ('__builtins__') Traceback (meest recente oproep laatste): Bestand "", regel 5, in print (eval ('sqrt (25)', ())) Bestand "", regel 1, in NameError: naam 'sqrt' is niet gedefinieerd

Als u een leeg woordenboek als globalen doorgeeft, zijn alleen de __builtins__beschikbaar voor expression(eerste parameter voor de eval()).

Hoewel we de mathmodule in het bovenstaande programma hebben geïmporteerd , heeft expression geen toegang tot de functies van de wiskundige module.

Voorbeeld 4: bepaalde methoden beschikbaar maken

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

Uitvoer

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

Hier kan de uitdrukking alleen de sqrt()en de pow()methoden samen met __builtins__.

Het is ook mogelijk om de naam van de beschikbare methode voor de uitdrukking naar wens te wijzigen:

 from math import * names = ('square_root': sqrt, 'power': pow) print(eval('dir()', names)) # Using square_root in Expression print(eval('square_root(9)', names))

Uitvoer

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

Berekent in het bovenstaande programma square_root()de vierkantswortel met sqrt(). Als u echter sqrt()direct probeert te gebruiken , zal er een fout optreden.

Voorbeeld 5: het gebruik van ingebouwde apparaten beperken

U kunt het gebruik van __builtins__in de uitdrukking als volgt beperken :

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

3. Het doorgeven van zowel globals als het lokale woordenboek

U kunt de benodigde functies en variabelen beschikbaar maken voor gebruik door het lokale woordenboek door te geven. Bijvoorbeeld:

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

Uitvoer

 13,0

In dit programma kan expressie alleen sqrt()methode en variabele a hebben. Alle andere methoden en variabelen zijn niet beschikbaar.

Door het gebruik van te beperken eval()door globale en lokale woordenboeken door te geven, wordt uw code veilig, vooral wanneer u invoer gebruikt die door de gebruiker aan de eval()methode is verstrekt.

Opmerking: soms eval()is het niet veilig, zelfs niet met beperkte namen. Wanneer een object en zijn methoden toegankelijk worden gemaakt, kan bijna alles worden gedaan. De enige veilige manier is door de gebruikersinvoer te valideren.

Interessante artikelen...