Python eval ()

Metoden eval () analyserar uttrycket som skickas till den här metoden och kör pythonuttryck (kod) i programmet.

Enkelt uttryckt eval()kör funktionen pythonkoden (som skickas som ett argument) inom programmet.

Syntaksen för eval()är:

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

eval () Parametrar

Den eval()funktionen tar tre parametrar:

  • expression - strängen analyseras och utvärderas som ett Python-uttryck
  • globals (valfritt) - en ordlista
  • lokalbefolkningen (valfritt) - ett kartläggningsobjekt. Ordbok är den vanliga och vanliga kartläggningstypen i Python.

Användningen av globala och lokalbefolkningen kommer att diskuteras senare i den här artikeln.

Returvärde från eval ()

Metoden eval () returnerar det utvärderade resultatet från uttrycket.

Exempel 1: Hur eval () fungerar i Python

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

Produktion

 2

Här eval()utvärderar funktionen uttrycket x + 1och printanvänds för att visa detta värde.

Exempel 2: Praktiskt exempel för att demonstrera användning 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

Produktion

 Skriv en funktion: beräknaArea (l) Om längden är 1, Area = 1 Om längden är 2, Area = 4 Om längden är 3, Area = 9 Om längden är 4, Area = 16

Varningar vid användning av eval ()

Tänk på en situation där du använder ett Unix-system (macOS, Linux etc) och att du har importerat osmodulen. OS-modulen ger ett bärbart sätt att använda operativsystemets funktioner som att läsa eller skriva till en fil.

Om du tillåter användare att mata in ett värde med hjälp av eval(input()), kan användaren utfärda kommandon för att ändra fil eller ens ta bort alla filer med kommandot: os.system('rm -rf *').

Om du använder eval(input())din kod är det en bra idé att kontrollera vilka variabler och metoder användaren kan använda. Du kan se vilka variabler och metoder som är tillgängliga med 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 ',' comb ',' copysign ',' cos ',' cosh ',' degrees ',' 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änsa användningen av tillgängliga metoder och variabler i eval ()

Oftare än inte behöver alla tillgängliga metoder och variabler som används i uttrycket (första parametern till eval()) inte behövas eller till och med ha ett säkerhetshål. Du kan behöva begränsa användningen av dessa metoder och variabler för eval(). Du kan göra det genom att skicka valfria globala och lokala parametrar (ordböcker) till eval()funktionen.

1. När både globala och lokala parametrar har utelämnats

Om båda parametrarna utelämnas (som i våra tidigare exempel) körs uttrycket i det aktuella omfånget. Du kan kontrollera tillgängliga variabler och metoder med hjälp av följande kod:

 print(eval('dir()')

2. Godkännande globalsparameter; local parameter utelämnas

Globala och lokala parametrar (ordböcker) används för globala respektive lokala variabler. Om lokal ordlista utelämnas är den som standard global ordbok. Det betyder att globaler kommer att användas för både globala och lokala variabler.

Obs: Du kan kontrollera den aktuella globala och lokala ordboken i Python med hjälp av globala () respektive lokalinbyggda () inbyggda metoder.

Exempel 3: Skicka tom ordbok som globalparameter

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

Produktion

 ('__builtins__') Spårning (senaste samtalet senast): Fil "", rad 5, i tryck (eval ('sqrt (25)', ())) File "", rad 1, i NameError: namn 'sqrt' definieras inte

Om du skickar en tom ordbok som globaler är endast de __builtins__tillgängliga för expression(första parametern till eval()).

Även om vi har importerat mathmodulen i ovanstående program kan uttryck inte komma åt några funktioner som matematikmodulen tillhandahåller.

Exempel 4: Göra vissa metoder tillgängliga

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

Produktion

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

Här kan uttrycket bara använda sqrt()och och pow()metoderna tillsammans med __builtins__.

Det är också möjligt att ändra namnet på den metod som är tillgänglig för uttrycket enligt din önskan:

 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 programmet ovan square_root()beräknar du kvadratroten med sqrt(). Att försöka använda sqrt()direkt kommer dock att leda till ett fel.

Exempel 5: Begränsa användningen av inbyggda program

Du kan begränsa användningen av __builtins__i uttrycket enligt följande:

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

3. Passerar både global och lokal ordbok

Du kan göra nödvändiga funktioner och variabler tillgängliga för användning genom att skicka lokal ordlistan. Till exempel:

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

Produktion

 13,0

I detta program kan uttryck endast ha sqrt()metod och variabel a. Alla andra metoder och variabler är inte tillgängliga.

Att begränsa användningen av eval()genom att skicka globala och lokala ordböcker kommer att göra din kod säker, särskilt när du använder inmatningar från användaren till eval()metoden.

Obs! Ibland eval()är det inte säkert även med begränsade namn. När ett objekt och dess metoder görs tillgängliga kan nästan vad som helst göras. Det enda säkra sättet är att validera användarinmatningen.

Intressanta artiklar...