logo

exec() Pythonissa

exec() -toimintoa käytetään Python-ohjelmien dynaamiseen suorittamiseen, jotka voivat olla joko merkkijono- tai objektikoodia. Jos se on merkkijono, merkkijono jäsennetään Python-lauseiden sarjana, joka sitten suoritetaan, ellei syntaksivirhettä tapahdu, ja jos se on objektikoodi, se yksinkertaisesti suoritetaan. Meidän on oltava varovaisia, että return-lauseita ei saa käyttää funktiomäärittelyjen ulkopuolella, ei edes exec()-funktiolle välitetyn koodin yhteydessä. Se ei palauta mitään arvoa, joten se palauttaa Ei mitään .

Python exec() -syntaksi

exec(objekti[, globaalit[, paikalliset]])



Parametrit:

  • esine: Kuten jo sanottiin, tämä voi olla merkkijono tai objektikoodi
  • globaalit: Tämä voi olla sanakirja ja parametri on valinnainen
  • paikalliset: Tämä voi olla kartoitusobjekti, ja se on myös valinnainen

Miten exec() toimii Pythonissa?

Tässä esimerkissä voimme nähdä dynaamisen suorituksen Pythonissa käyttämälläexec()>toiminto. Se osoittaa kyvyn suorittaa objektin sisältämää koodia dynaamisesti ja esittelee dynaamisen suorituksen käsitteen Pythonissa.

Python 3








prog>=> 'print('The sum of 5 and 10 is', (5+10))'> exec>(prog)>

>

>

Lähtö

The sum of 5 and 10 is 15>

Varoitus tai rajoitukset

Ennen kuin käytät menetelmiä exec()-funktion sisällä, on muistettava, mitä kaikki funktiot exec() tukevat. Tämän katsomiseksi saatamme käyttää dir()-funktiota.

Tässä esimerkissä voimme nähdä Pythonin dynaamisen suorituksen muodossadir()>toiminto suoritetaan sisälläexec()>funktio, joka havainnollistaa dynaamisen suorituksen käsitettä Pythonissa.

Python 3




# The math class is used to include all the> # math functions> from> math>import> *> exec>(>'print(dir())'>)>

>

>

Lähtö

['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']>

Globaalit ja paikalliset parametrit

Pythonin avulla voimme rajoittaa erilaisten muuttujien ja menetelmien käyttöä käyttämällä globaaleja ja paikallisia parametreja, joita ei ehkä tarvita. Näitä paikallisia ja globaaleja parametreja käytetään paikallisille tai globaaleille muuttujille, pääasiassa sanakirjoille. Globaali parametri ohittaa, jos paikallinen puuttuu, mikä tarkoittaa, että globaalia voidaan käyttää molemmissa kentissä. Katsotaan kuinka koodi toimii välittäessään vain globaalin parametrin.

Python 3




# Here we have passed an empty dictionary> from> math>import> *> exec>(>'print(dir())'>, {})>

>

>

Lähtö

['__builtins__']>

Joten näemme, että kun tyhjä sanakirja välitetään globaaliksi parametriksi, vain __builtins__ näytetään, eikä muita matemaattisia funktioita näytetä kuten edellisessä esimerkissä. Tämä tarkoittaa, että vain __builtins__ tuetaan objektiparametrille. Tämä viittaa siihen, että kaikki muut toiminnot on rajoitettu objektiin. Todistaaksemme sen, yritetään työskennellä matemaattisen funktion kanssa ja katsotaan mitä tapahtuu.

Python 3




# An exception will be raised> from> math>import> *> exec>(>'print(factorial(5))'>, {})>

>

>

Tässä esimerkissä olisi pitänyt tulostaa tulosteena 120, mutta sen sijaan se näyttää Ei lähtöä ja aiheuttaa poikkeuksen. Vaikka olemme tuoneet matemaattisen moduulin, factorial()-menetelmä ei toiminut rajoitusten vuoksi, jotka olemme asettaneet välittämällä globaali parametri.
Voimme myös sallia muutaman funktion suorittamisen. Oletetaan, että haluamme kaikkien muiden matemaattisten moduulien olevan rajoitettuja paitsi factorial()-funktion.

Python 3




# factorial() will be executed> from> math>import> *> exec>(>'print(factorial(5))'>, {>'factorial'>:factorial})>

>

>

Lähtö

120>

Voimme myös muuttaa näiden ennalta määritettyjen menetelmien nimiä ja antaa niille käyttäjän määrittämät nimet suorituksen aikana. Voimme muuttaa funktion nimeä factorial() to fakta() , joka on käyttäjän määrittämä.

Python 3




# factorial() renamed as fact> from> math>import> *> exec>(>'print(fact(5))'>, {>'fact'>: factorial})>

>

>

Lähtö

120>

Tässä skenaariossa voimme räätälöidä suoritetun koodin käyttäytymistä erityisvaatimustemme mukaan välittämällä sekä globaaleja että paikallisia parametreja, mikä osoittaa Pythonin dynaamisen suorituksen monipuolisuuden.

Python 3




from> math>import> *> exec>(>'print(dir())'>, {>'built'> : __builtins__}, {>'sum'>:>sum>,>'iter'>:>iter>})>

>

>

Lähtö

['iter', 'sum']>

Pythonin dynaaminen suoritus mahdollistaa tiettyjen menetelmien suorittamisen, kutensum()>jaiter()>sekä sisällä olevia sisäänrakennettuja menetelmiäexec()>toiminto, joka osoittaa Pythonin dynaamisen suorituksen joustavuuden. Tämän avulla vain summa- ja iter-menetelmät sekä kaikki sisäänrakennetut menetelmät voidaan suorittaa exec()-funktion sisällä. Voimme myös rajoittaa __builtins__-käyttöä seuraavasti:

Python 3


hakemiston uudelleennimeäminen linuxissa



#__builtins__ has been restricted using None> from> math>import> *> exec>(>'print(dir())'>, {>'__builtins__'> :>None>}, {>'sum'>:>sum>,>'print'>:>print>,>'dir'>:>dir>})>

>

>

Lähtö

['dir', 'print', 'sum']>