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 + 1
ja print
sitä 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 os
moduulin. 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 math
moduulin 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ö.