„Python exec“ ()

Metodas „exec“ () vykdo dinamiškai sukurtą programą, kuri yra eilutė arba kodo objektas.

Sintaksė exec():

 exec (objektas, globalūs, vietiniai)

exec () parametrai

exec() turi tris parametrus:

  • objektas - arba eilutė, arba kodo objektas
  • 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 straipsnyje.

Grąžinimo vertė iš „exec“ ()

exec()negrąžina jokios vertės, ji grąžinama None.

1 pavyzdys: Kaip veikia „exec“)?

 program = 'a = 5b=10print("Sum =", a+b)' exec(program)

Rezultatas

 Suma = 15

Čia perduodama eilutės objekto programa, exec()kuri vykdo programą. globalūs ir vietiniai gyventojai šiuo atveju praleidžiami.

2 pavyzdys: leiskite vartotojui pateikti įvestį

  program = input('Enter a program:') exec(program) 

Rezultatas

 Įveskite programą: (spausdinkite (elementą) elementui (1, 2, 3)) 1 2 3

Jei norite paimti „Python“ kodą iš vartotojo, kuris leidžia naudoti kelių eilučių kodą (naudojant ''), compile()prieš naudodami galite naudoti metodą exec().

Sužinokite daugiau apie „Python“ metodą „compile ()“.

Būkite atsargūs naudodami „exec“ ()

Apsvarstykite situaciją, jūs 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žiate vartotojams įvesti vertę naudodami exec(input()), vartotojas gali leisti komandas pakeisti failą arba net ištrinti visus failus naudodamas komandą os.system('rm -rf *').

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

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

Rezultatas

(„In“, „Out“, „_“, „__“, „___“, „__builtin__“, „__builtins__“, „__name__“, „_dh“, „_i“, „_i1“, „_i2“, “ _ih ',' _ii ',' _iii ',' _oh ',' _sh ',' acos ',' acosh ',' asin ',' asinh ',' atan ',' atan2 ',' atanh ',' lubos ' , „copysign“, „cos“, „cosh“, „laipsniai“, „e“, „erf“, „erfc“, „exit“, „exp“, „expm1“, „fabs“, „faktorialas“, “ aukštas ',' fmod ',' frexp ',' fsum ',' gama ',' gcd ',' get_ipython ',' hipot ',' inf ',' isclose ',' isfinite ',' isinf ',' isnan ' , „ldexp“, “lgamma ',' log ',' log10 ',' log1p ',' log2 ',' modf ',' nan ',' pi ',' pow ',' quit ',' radians ',' sin ',' sinh ' , „sqrt“, „tan“, „tanh“, „trunc“)

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

Dažniausiai visi turimi metodai ir kintamieji, naudojami, exec()gali būti nereikalingi arba netgi gali turėti saugumo spragą. Galite apriboti šių kintamųjų ir metodų naudojimą perduodant pasirinktinius globalius ir vietinius parametrus (žodynus) exec()metodui.

1. Išskiriami tiek globaliniai, tiek vietiniai parametrai

Jei abu parametrai yra praleisti (kaip ir ankstesniuose pavyzdžiuose), kodas, kurį tikimasi vykdyti, exec()vykdomas pagal dabartinę sritį. Galite patikrinti galimus kintamuosius ir metodus naudodami šį kodą:

 „exec“ („print (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. Tuščio žodyno perdavimas kaip globalaus parametro

 from math import * exec('print(dir())', ()) # This code will raise an exception # exec('print(sqrt(9))', ())

Jei tuščią žodyną perduodate kaip visuotinius, __builtins__prieinami tik object(pirmasis parametras exec ()). Nors mes importavome matematikos modulį iš pirmiau nurodytos programos, bandymas pasiekti bet kurią iš matematikos modulio teikiamų funkcijų sukels išimtį.

Rezultatas

 ('__builtins__')

Tam tikrų metodų pateikimas

 from math import * exec('print(dir())', ('sqrt': sqrt, 'pow': pow)) # object can have sqrt() module exec('print(sqrt(9))', ('sqrt': sqrt, 'pow': pow))

Čia taip pat gali būti kodas exec () sqrt()ir pow()metodai __builtins__.

Galima pakeisti metodo pavadinimą pagal jūsų norą.

 from math import * exec('print(dir())', ('squareRoot': sqrt, 'pow': pow)) # object can have squareRoot() module exec('print(squareRoot(9))', ('squareRoot': sqrt, 'pow': pow))

Pirmiau pateiktoje programoje squareRoot()apskaičiuokite kvadratinę šaknį (panašią funkciją kaip sqrt()). Tačiau bandymas naudoti sqrt()sukels išimtį.

Įdiegtų objektų naudojimo apribojimas

Galite apriboti naudoti __builtins__suteikiant vertę Noneį '__builtins__'į Globals žodyne.

 „exec“ (objektas, ('__builtins__': nėra)) 

4. Globalų ir vietinių žodyno perdavimas

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

 from math import * globalsParameter = ('__builtins__' : None) localsParameter = ('print': print, 'dir': dir) exec('print(dir())', globalsParameter, localsParameter)

Rezultatas

 („dir“, „spausdinti“) 

Čia exec()metodu galima vykdyti tik du įmontuotus metodus print () ir dir () .

Svarbu pažymėti, kad, exec()įvykdo kodą ir negrąžina jokios vertės (grąžina None). Taigi, jūs negalite naudoti grąžos ir grąžos sakinių už funkcijų apibrėžimų ribų.

Įdomios straipsniai...