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 + 1
och print
anvä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 os
modulen. 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 math
modulen 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.