„Python eval“ ()

Metodas eval () analizuoja šiam metodui perduotą išraišką ir programoje paleidžia pitono išraišką (kodą).

Paprasčiau tariant, eval()funkcija programoje paleidžia pitono kodą (kuris perduodamas kaip argumentas).

Sintaksė eval()yra:

 eval (išraiška, globaliniai = Nėra, vietiniai = Nėra)

eval () parametrai

eval()Funkcija trunka tris parametrus:

  • išraiška - eilutė išanalizuota ir įvertinta kaip „Python“ išraiška
  • globaliniai (neprivaloma) - žodynas
  • vietiniai (pasirinktinai) - žemėlapio objektas. Žodynas yra standartinis ir dažniausiai naudojamas „Python“ atvaizdavimo tipas.

Globalų ir vietinių gyventojų naudojimas bus aptariamas vėliau šiame straipsnyje.

Grąžinimo vertė iš eval ()

Metodas eval () pateikia rezultatą, įvertintą iš išraiškos.

1 pavyzdys: kaip „eval“) veikia „Python“

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

Rezultatas

 2

Čia eval()funkcija įvertina išraišką x + 1ir printnaudojama šiai vertei parodyti.

2 pavyzdys: praktinis pavyzdys, kaip įrodyti eval () naudojimą

 # 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

Rezultatas

 Įveskite funkciją: apskaičiuokite Plotas (l) Jei ilgis yra 1, Plotas = 1 Jei ilgis yra 2, Plotas = 4 Jei ilgis yra 3, Plotas = 9 Jei ilgis yra 4, Plotas = 16

Įspėjimai naudojant eval ()

Apsvarstykite situaciją, kai naudojate „Unix“ sistemą („MacOS“, „Linux“ ir kt.) Ir importavote osmodulį. OS modulis suteikia nešiojamąjį būdą naudoti operacinės sistemos funkcijas, pvz., Skaityti ar rašyti į failą.

Jei leidžia vartotojams įvesti reikšmę naudojant eval(input()), vartotojas gali išduoti komandas pakeisti failo ar net ištrinti visus failus naudojant komandą: os.system('rm -rf *').

Jei naudojate eval(input())savo kodą, verta patikrinti, kuriuos kintamuosius ir metodus vartotojas gali naudoti. Naudodami dir () metodą, galite pamatyti, kurie kintamieji ir metodai yra prieinami.

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

Rezultatas

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' lubos ',' šukos ',' kopijavimo ',' cos ',' cosh ',' laipsniai ',' dist ',' e ',' erf ' , „erfc“, „exp“, „expm1“, „fabs“, „faktorialas“, „grindys“, „fmod“, „frexp“, „fsum“, „gama“, „gcd“, „hipotetas“, “ inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radianai ',' likutis ',' sin ',' sinh ',' sqrt ' , „tan“, „tanh“, „tau“, „trunc“)

Galimų metodų ir kintamųjų naudojimo apribojimas „eval“ ()

Dažniausiai visi galimi išraiškoje naudojami metodai ir kintamieji (pirmasis parametras iki eval()) gali būti nereikalingi arba netgi gali turėti saugos spragą. Jums gali tekti apriboti šių metodų ir kintamųjų naudojimą eval(). Tai galite padaryti perduodami funkcijai pasirinktinius globalius ir vietinius parametrus (žodynus) eval().

1. Kai praleidžiami tiek globaliniai, tiek vietiniai parametrai

Jei abu parametrai yra praleisti (kaip ir ankstesniuose pavyzdžiuose), išraiška vykdoma dabartinėje srityje. Galite patikrinti galimus kintamuosius ir metodus naudodami šį kodą:

 print(eval('dir()')

2. „Globals“ parametras; vietinių parametras praleistas

Visuotiniai ir vietiniai parametrai (žodynai) naudojami atitinkamai globaliesiems ir lokaliesiems kintamiesiems. Jei vietinių žodynas praleidžiamas, jis pagal numatytuosius nustatymus yra pasaulinis žodynas. Reiškia, globalieji bus naudojami tiek globaliems, tiek vietiniams kintamiesiems.

Pastaba: dabartinį „Python“ visuotinį ir vietinį žodyną galite patikrinti naudodami įmontuotus „globals“ () ir „localals“ () metodus.

3 pavyzdys: tuščio žodyno perdavimas kaip visuotinio parametro

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

Rezultatas

 ('__builtins__') „Traceback“ (paskutinis paskutinis skambutis): Failas "", 5 eilutė, atspausdinta (eval ('sqrt (25)', ())) Failas "", 1 eilutė, NameError: vardas 'sqrt' nėra apibrėžta

Jei tuščią žodyną perduodate kaip visuotinius, __builtins__prieinami yra tik jie expression(pirmasis parametras eval()).

Nors mes importavome mathmodulį iš pirmiau nurodytos programos, išraiška negali pasiekti jokių matematikos modulio teikiamų funkcijų.

4 pavyzdys: Tam tikrų metodų pateikimas

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

Rezultatas

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

Čia išraiška gali būti naudojami tik sqrt()ir pow()metodai kartu su __builtins__.

Taip pat galima pakeisti išraiškos metodo pavadinimą pagal jūsų pageidavimą:

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

Rezultatas

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

Pirmiau pateiktoje programoje square_root()apskaičiuokite kvadratinę šaknį naudodami sqrt(). Tačiau bandant naudoti sqrt()tiesiogiai iškils klaida.

5 pavyzdys: Įdiegtųjų naudojimo apribojimas

Galite apriboti __builtins__išraiškos naudojimą taip:

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

3. Globalų ir vietinių žodyno perdavimas

Praleidę vietinių žodyną, galite padaryti reikalingas funkcijas ir kintamuosius naudoti. Pavyzdžiui:

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

Rezultatas

 13.0

Šioje programoje išraiška gali turėti tik sqrt()metodą ir kintamąjį a. Visi kiti metodai ir kintamieji nėra.

Apribojus eval()pravažiuojančių pasaulinių ir vietinių žodynų naudojimą, jūsų kodas taps saugus, ypač kai naudojate vartotojo įvestą eval()metodo metodą.

Pastaba: kartais eval()nėra saugus net ir naudojant ribotus pavadinimus. Kai objektas ir jo metodai tampa prieinami, galima padaryti beveik viską. Vienintelis saugus būdas yra patvirtinti vartotojo įvestį.

Įdomios straipsniai...