Python eval ()

Eval () -menetelmä jäsentää tälle menetelmälle välitetyn lausekkeen ja suorittaa python-lausekkeen (koodi) ohjelman sisällä.

Yksinkertaisesti sanottuna eval()funktio suorittaa python-koodin (joka välitetään argumenttina) ohjelman sisällä.

Syntaksi eval()on:

 eval (lauseke, globaalit = Ei mitään, paikalliset = Ei mitään)

eval () -parametrit

eval()Toiminto kestää kolme parametrit:

  • lauseke - merkkijono jäsennettiin ja arvioitiin Python-lausekkeeksi
  • globaalit (valinnainen) - sanakirja
  • paikalliset (valinnainen) - kartoitusobjekti. Sanakirja on tavallinen ja yleisesti käytetty kartoitustyyppi Pythonissa.

Globaalien ja paikallisten käytöstä keskustellaan myöhemmin tässä artikkelissa.

Palautusarvo eval ()

Eval () -menetelmä palauttaa lausekkeesta arvioidun tuloksen.

Esimerkki 1: Kuinka eval () toimii Pythonissa

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

Tuotos

 2

Tässä eval()funktio arvioi lausekkeen x + 1ja printsitä käytetään tämän arvon näyttämiseen.

Esimerkki 2: Käytännön esimerkki eval (): n käytön osoittamiseksi

 # 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

Tuotos

 Kirjoita funktio: calcArea (l) Jos pituus on 1, Area = 1 Jos pituus on 2, Area = 4 Jos pituus on 3, Area = 9 Jos pituus on 4, Area = 16

Varoitukset käytettäessä eval ()

Tarkastellaan tilannetta, jossa käytät Unix-järjestelmää (macOS, Linux jne.) Ja olet tuonut osmoduulin. OS-moduuli tarjoaa kannettavan tavan käyttää käyttöjärjestelmän toimintoja, kuten tiedostoon lukemista tai kirjoittamista.

Jos käyttäjät voivat syöttää arvoon käyttäen eval(input()), käyttäjä voi antaa komentoja muutos tiedosto tai jopa poistaa kaikki tiedostot komennolla: os.system('rm -rf *').

Jos käytät eval(input())koodissasi, on hyvä tarkistaa, mitä muuttujia ja menetelmiä käyttäjä voi käyttää. Dir () -menetelmällä näet, mitkä muuttujat ja menetelmät ovat käytettävissä.

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

Tuotos

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' katto ',' kampa ',' kopiosign ',' cos ',' cosh ',' astetta ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factororial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', ' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radians ',' jäännös ',' sin ',' sinh ',' sqrt ' ('tan', 'tanh', 'tau', 'trunc')

Käytettävissä olevien menetelmien ja muuttujien käytön rajoittaminen eval (): ssa

Useimmiten kaikkia käytettävissä olevia menetelmiä ja muuttujia, joita käytetään lausekkeessa (ensimmäinen parametri eval()), ei välttämättä tarvita, tai niillä voi olla jopa turvallisuusreikä. Saatat joutua rajoittamaan näiden menetelmien ja muuttujien käyttöä eval(). Voit tehdä sen välittämällä toiminnolle valinnaiset globaalit ja paikalliset parametrit (sanakirjat) eval().

1. Kun sekä globaalit että paikalliset parametrit jätetään pois

Jos molemmat parametrit jätetään pois (kuten aiemmissa esimerkeissämme), lauseke suoritetaan nykyisessä laajuudessa. Voit tarkistaa käytettävissä olevat muuttujat ja menetelmät seuraavalla koodilla:

 print(eval('dir()')

2. Passivaava globaali parametri; localals-parametri jätetään pois

Globaalia ja paikallista parametria (sanakirjoja) käytetään vastaavasti globaaleihin ja paikallisiin muuttujiin. Jos paikallisten sanakirja jätetään pois, se on oletusarvoisesti maailmanlaajuinen sanakirja. Merkitys, globaaleja käytetään sekä globaaleihin että paikallisiin muuttujiin.

Huomautus: Voit tarkistaa nykyisen yleisen ja paikallisen sanakirjan Pythonissa käyttämällä sisäänrakennettuja globaaleja () ja paikallisia () menetelmiä.

Esimerkki 3: Tyhjän sanakirjan välittäminen globaalina parametrina

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

Tuotos

 ('__builtins__') Seuranta (viimeisin puhelu viimeisin): Tiedosto "", rivi 5, tulostettuna (eval ('sqrt (25)', ())) Tiedosto "", rivi 1, NameError: nimi 'sqrt' ei ole määritelty

Jos välität tyhjän sanakirjan globaaleina, vain ne __builtins__ovat käytettävissä expression(ensimmäinen parametri eval()).

Vaikka olemme tuoneet mathmoduulin yllä olevaan ohjelmaan, lauseke ei voi käyttää mitään matematiikkamoduulin tarjoamia toimintoja.

Esimerkki 4: Tiettyjen menetelmien asettaminen saataville

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

Tuotos

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

Tässä ilmauksen voi käyttää vain sqrt()ja pow()menetelmiä yhdessä __builtins__.

Lausekkeelle käytettävissä olevan menetelmän nimi on myös mahdollista muuttaa haluamallasi tavalla:

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

Tuotos

 ('__builtins__', 'teho', 'neliöjuuri') 3.0

square_root()Laske edellisessä ohjelmassa neliöjuuri käyttämällä sqrt(). Suoran käytön yrittäminen kuitenkin sqrt()aiheuttaa virheen.

Esimerkki 5: Sisäisten käyttöjen rajoittaminen

Voit rajoittaa __builtins__lausekkeen käyttöä seuraavasti:

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

3. Sekä maailmanlaajuisten että paikallisten sanakirjan läpäisy

Voit asettaa tarvittavat toiminnot ja muuttujat käytettäväksi ohittamalla paikallisten sanakirjan. Esimerkiksi:

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

Tuotos

 13.0

Tässä ohjelmassa lausekkeella voi olla vain sqrt()menetelmä ja muuttuja a. Kaikki muut menetelmät ja muuttujat eivät ole käytettävissä.

eval()Globaalien ja paikallisten sanakirjojen käytön rajoittaminen tekee koodistasi turvallisen erityisesti silloin, kun käytät eval()menetelmän käyttäjän antamaa syötettä .

Huomaa: Joskus se eval()ei ole turvallinen, vaikka rajoitetuilla nimillä. Kun esine ja sen menetelmät asetetaan saataville, melkein mitä tahansa voidaan tehdä. Ainoa turvallinen tapa on vahvistaa käyttäjän syöttö.

Mielenkiintoisia artikkeleita...