Python eval ()

Metóda eval () analyzuje výraz odovzdaný tejto metóde a v rámci programu spustí výraz (kód) pythonu.

Zjednodušene povedané, eval()funkcia spustí v programe programovací kód python (ktorý sa odovzdáva ako argument).

Syntax eval()je:

 eval (výraz, globály = žiadne, miestne = žiadne)

eval () Parametre

eval()Funkcia má tri parametre:

  • výraz - reťazec analyzovaný a vyhodnotený ako výraz v jazyku Python
  • globály (voliteľné) - slovník
  • locals (voliteľné) - mapovací objekt. Slovník je štandardný a bežne používaný typ mapovania v Pythone.

O použití globálov a miestnych obyvateľov sa bude diskutovať ďalej v tomto článku.

Návratová hodnota z eval ()

Metóda eval () vracia výsledok vyhodnotený z výrazu.

Príklad 1: Ako funguje eval () v Pythone

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

Výkon

 2

Tu eval()funkcia vyhodnotí výraz x + 1a printpoužije sa na zobrazenie tejto hodnoty.

Príklad 2: Praktický príklad na preukázanie použitia funkcie 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

Výkon

 Zadajte funkciu: CalcArea (l) Ak je dĺžka 1, Plocha = 1 Ak je dĺžka 2, Plocha = 4 Ak je dĺžka 3, Plocha = 9 Ak je dĺžka 4, Plocha = 16

Varovania pri použití eval ()

Zvážte situáciu, keď používate unixový systém (macOS, Linux atď.) A osmodul ste importovali . Modul os poskytuje prenosný spôsob, ako používať funkcie operačného systému, ako je čítanie alebo zápis do súboru.

Ak máte používateľom umožniť vstup hodnotu pomocou eval(input())môže užívateľ vydávať príkazy do súboru zmeniť alebo dokonca odstrániť všetky súbory pomocou príkazu: os.system('rm -rf *').

Ak eval(input())vo svojom kóde používate, je dobré skontrolovať, ktoré premenné a metódy môže používateľ použiť. Pomocou metódy dir () môžete zistiť, ktoré premenné a metódy sú k dispozícii.

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

Výkon

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' hrebeň ',' copysign ',' cos ',' cosh ',' stupňov ',' dist ',' e ',' erf ' „erfc“, „exp“, „expm1“, „fabs“, „faktoriál“, „floor“, „fmod“, „frexp“, „fsum“, „gama“, „gcd“, „hypot“, „ inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radiány ',' zvyšok ',' sin ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')

Obmedzenie používania dostupných metód a premenných v eval ()

Častejšie eval()nemusí byť potrebné všetky dostupné metódy a premenné použité vo výraze (prvý parameter až ), alebo dokonca môžu mať bezpečnostnú dieru. Možno budete musieť obmedziť použitie týchto metód a premenných pre eval(). Môžete to urobiť tak, že eval()funkcii odovzdáte voliteľné parametre globálov a miestnych obyvateľov (slovníky) .

1. Keď sú vynechané parametre globálne aj miestne

Ak sú oba parametre vynechané (ako v našich predchádzajúcich príkladoch), výraz sa vykoná v aktuálnom rozsahu. Dostupné premenné a metódy môžete skontrolovať pomocou nasledujúceho kódu:

 print(eval('dir()')

2. Passing globals parameter; parameter locals je vynechaný

Parametre globals a locals (slovníky) sa používajú pre globálne a lokálne premenné. Ak je slovník miestnych obyvateľov vynechaný, použije sa predvolený slovník globálov. To znamená, že globálne budú použité pre globálne aj lokálne premenné.

Poznámka: Aktuálny globálny a lokálny slovník v Pythone môžete skontrolovať pomocou vstavaných metód globals () a locals ().

Príklad 3: Odovzdanie prázdneho slovníka ako parametra globálov

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

Výkon

 ('__builtins__') Traceback (posledné posledné hovory): Súbor "", riadok 5, v tlači (eval ('sqrt (25)', ())) Súbor "", riadok 1, v NameError: názov 'sqrt' nie je definované

Ak odovzdáte prázdny slovník ako globály, k __builtins__dispozícii sú iba expression(prvý parameter eval()).

Aj keď sme mathmodul importovali do vyššie uvedeného programu, výraz nemá prístup k žiadnym funkciám poskytovaným matematickým modulom.

Príklad 4: Sprístupnenie určitých metód

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

Výkon

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

Tu sa pojem sa môže použiť len sqrt()a pow()metódy spolu s __builtins__.

Je tiež možné zmeniť názov metódy dostupnej pre výraz podľa vášho želania:

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

Výkon

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

Vo vyššie uvedenom programe sa square_root()vypočíta druhá odmocnina pomocou sqrt(). Pokus o sqrt()priame použitie však spôsobí chybu.

Príklad 5: Obmedzenie používania vstavaných zariadení

Použitie __builtins__výrazu môžete obmedziť nasledovne:

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

3. Absolvovanie slovníka globálnych aj miestnych obyvateľov

Potrebné funkcie a premenné môžete sprístupniť na použitie odovzdaním slovníka miestnych obyvateľov. Napríklad:

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

Výkon

 13.0

V tomto programe môže mať výraz iba sqrt()metódu a premennú a. Všetky ostatné metódy a premenné nie sú k dispozícii.

Obmedzením používania eval()prechodom globálov a miestnych slovníkov bude váš kód zabezpečený, najmä ak používate pre eval()metódu vstup poskytnutý používateľom .

Poznámka: Niekedy eval()nie je zabezpečená ani pri obmedzených menách. Po sprístupnení objektu a jeho metód je možné urobiť takmer všetko. Jediným bezpečným spôsobom je overenie vstupu používateľa.

Zaujímavé články...