Python eval ()

Az eval () metódus elemzi az ennek a módszernek továbbított kifejezést, és a programon belül futtatja a python kifejezést (kódot).

Egyszerűbben fogalmazva, a eval()függvény futtatja a python kódot (amelyet argumentumként adunk át) a programon belül.

A szintaxisa eval():

 eval (kifejezés, globálisok = nincsenek, lokálisok = nincsenek)

eval () Paraméterek

A eval()függvénynek három paramétere van:

  • kifejezés - a karakterlánc Python-kifejezésként értelmezett és értékelt
  • globálok (opcionális) - szótár
  • helyiek (opcionális) - leképező objektum. A szótár a Python szabványos és gyakran használt leképezési típusa.

A globálisok és a helyiek használatát a cikk később tárgyalja.

Visszatérési érték az eval () alapján

Az eval () metódus a kifejezésből kiértékelt eredményt adja vissza.

1. példa: Hogyan működik az eval () a Pythonban

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

Kimenet

 2

Itt a eval()függvény kiértékeli a kifejezést, x + 1és printezt az értéket jeleníti meg.

2. példa: Gyakorlati példa az eval () használatának bemutatására

 # 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

Kimenet

 Írjon be egy függvényt: kiszámítja a területet (l) Ha a hossz 1, akkor a Terület = 1 Ha a hossz 2, a Terület = 4 Ha a hossz 3, a Terület = 9 Ha a hossz 4, a Terület = 16

Figyelmeztetések az eval () használatakor

Vegyünk egy helyzetet, amikor Unix rendszert (macOS, Linux stb.) Használ, és importálta a osmodult. Az os modul hordozható módon biztosítja az operációs rendszer funkcióinak használatát, például egy fájlba való olvasást vagy írást.

Ha a felhasználók input egy értéket eval(input()), a felhasználó parancsokat kiadni változás fájl, vagy akár törölheti az összes fájlt parancs segítségével: os.system('rm -rf *').

Ha eval(input())a kódjában használja, célszerű ellenőrizni, hogy a felhasználó mely változókat és módszereket használhatja. A dir () metódus segítségével megnézheti, mely változók és módszerek érhetők el.

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

Kimenet

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' mennyezet ',' fésű ',' másolatkészítés ',' cos ',' cosh ',' fok ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hipot', ' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radián ',' maradék ',' sin ',' sinh ',' sqrt ' , „tan”, „tanh”, „tau”, „trunc”)

A rendelkezésre álló módszerek és változók használatának korlátozása az eval ()

Gyakran előfordulhat, hogy a kifejezésben használt összes rendelkezésre álló módszerre és változóra (első paraméter eval():) nincs szükség, vagy akár biztonsági lyuk is lehet. Lehetséges, hogy korlátoznia kell ezeknek a módszereknek és változóknak a felhasználót eval(). Ezt úgy teheti meg, hogy az opcionális globális és lokális paramétereket (szótárakat) átadja a eval()függvénynek.

1. Amikor mind a globális, mind a lokális paramétereket kihagyják

Ha mindkét paraméter kihagyásra kerül (mint a korábbi példáinkban), akkor a kifejezés az aktuális hatókörben kerül végrehajtásra. A rendelkezésre álló változókat és módszereket a következő kód használatával ellenőrizheti:

 print(eval('dir()')

2. Globális paraméter átadása; a localals paraméter kihagyásra kerül

A globális és a lokális paramétereket (szótárakat) a globális és a lokális változókhoz használják. Ha a helyiek szótárát kihagyja, az alapértelmezés szerint globális szótár. Jelentése: a globálisokat mind a globális, mind a lokális változókhoz használni fogjuk.

Megjegyzés: A globális (és a helyi) szótárat ellenőrizheti a Pythonban globals () és localals () beépített módszerekkel.

3. példa: Üres szótár átadása globális paraméterként

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

Kimenet

 ('__builtins__') Traceback (a legutóbbi hívás utoljára): "" fájl, 5. sor, nyomtatásban (eval ('sqrt (25)', ())) "" fájl, 1. sor, a NameError-ban: név 'sqrt' nem meghatározott

Ha üres szótárat ad át globálisként, csak a (z) első paramétere __builtins__érhető el .expressioneval()

Annak ellenére, hogy a mathmodult importáltuk a fenti programba, az expresszió nem fér hozzá a matematikai modul által biztosított funkciókhoz.

4. példa: Bizonyos módszerek elérhetővé tétele

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

Kimenet

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

Itt a kifejezés csak a sqrt()és pow()metódusokat használhatja együtt __builtins__.

Megváltoztatható a kifejezés számára elérhető módszer neve is:

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

Kimenet

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

A fenti programban square_root()a négyzetgyököt használja a sqrt(). A sqrt()közvetlen használat megkísérlése azonban hibát vet fel.

5. példa: A beépítettek használatának korlátozása

Az alábbiak szerint korlátozhatja __builtins__a kifejezés használatát a kifejezésben:

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

3. A globális és a helyiek szótárának átadása

A szükséges funkciókat és változókat elérhetővé teheti a helyiek szótárának átadásával. Például:

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

Kimenet

 13.0

Ebben a programban a kifejezésnek csak sqrt()metódusa és változója lehet. Az összes többi módszer és változó nem érhető el.

A eval()globális és helyi szótárak átadásának korlátozása a kódot biztonságossá teszi, különösen akkor, ha a felhasználó által a eval()módszerhez megadott bevitelt használja .

Megjegyzés: Néha eval()még korlátozott nevekkel sem biztonságos. Amikor egy objektumot és annak módszereit hozzáférhetővé teszik, szinte mindent meg lehet tenni. Az egyetlen biztonságos módszer a felhasználói bevitel ellenőrzése.

érdekes cikkek...