Kaedah eval () menguraikan ungkapan yang diteruskan ke kaedah ini dan menjalankan ekspresi python (kod) dalam program.
Secara sederhana, eval()
fungsi menjalankan kod python (yang diserahkan sebagai argumen) dalam program.
Sintaksnya eval()
adalah:
eval (ungkapan, global = Tiada, penduduk tempatan = Tiada)
Parameter eval ()
Yang eval()
fungsi mengambil masa tiga parameter:
- ekspresi - rentetan dihurai dan dinilai sebagai ungkapan Python
- global (pilihan) - kamus
- penduduk tempatan (pilihan) - objek pemetaan. Kamus adalah jenis pemetaan standard dan biasa digunakan di Python.
Penggunaan global dan penduduk tempatan akan dibincangkan kemudian dalam artikel ini.
Nilai Pulangan dari eval ()
Kaedah eval () mengembalikan hasil yang dinilai dari ungkapan.
Contoh 1: Bagaimana eval () berfungsi di Python
x = 1 print(eval('x + 1'))
Pengeluaran
2
Di sini, eval()
fungsi menilai ekspresi x + 1
dan print
digunakan untuk memaparkan nilai ini.
Contoh 2: Contoh praktikal untuk menunjukkan penggunaan eval ()
# 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
Pengeluaran
Taipkan fungsi: hitungArea (l) Jika panjangnya 1, Luas = 1 Jika panjangnya 2, Luas = 4 Jika panjangnya 3, Luas = 9 Jika panjangnya 4, Luas = 16
Amaran semasa menggunakan eval ()
Pertimbangkan situasi di mana anda menggunakan sistem Unix (macOS, Linux dll) dan anda telah mengimport os
modul. Modul os menyediakan cara mudah alih untuk menggunakan fungsi sistem operasi seperti membaca atau menulis ke fail.
Jika anda membenarkan pengguna untuk input nilai yang menggunakan eval(input())
, pengguna boleh mengeluarkan arahan kepada fail perubahan atau menghapuskan semua fail yang menggunakan arahan: os.system('rm -rf *')
.
Sekiranya anda menggunakan eval(input())
kod anda, ada baiknya anda memeriksa pemboleh ubah dan kaedah mana yang boleh digunakan pengguna. Anda dapat melihat pemboleh ubah dan kaedah mana yang tersedia menggunakan kaedah dir ().
from math import * print(eval('dir()'))
Pengeluaran
('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' comb ',' copysign ',' cos ',' cosh ',' degrees ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', '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 ',' sisa ',' sin ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')
Mengehadkan Penggunaan Kaedah dan Pembolehubah yang Tersedia dalam eval ()
Lebih sering daripada tidak, semua kaedah dan pemboleh ubah yang tersedia yang digunakan dalam ungkapan (parameter pertama hingga eval()
) mungkin tidak diperlukan, atau bahkan mungkin mempunyai lubang keselamatan. Anda mungkin perlu menyekat penggunaan kaedah dan pemboleh ubah ini untuk eval()
. Anda boleh melakukannya dengan meneruskan parameter (kamus) global dan penduduk tempatan ke eval()
fungsi tersebut.
1. Apabila parameter global dan penduduk tempatan dihilangkan
Sekiranya kedua-dua parameter tersebut dihilangkan (seperti contoh sebelumnya), ungkapan tersebut dilaksanakan dalam skop semasa. Anda boleh memeriksa pemboleh ubah dan kaedah yang ada menggunakan kod berikut:
print(eval('dir()')
2. Melewatkan parameter global; parameter penduduk diabaikan
Parameter global dan tempatan (kamus) masing-masing digunakan untuk pemboleh ubah global dan tempatan. Sekiranya kamus penduduk tempatan ditinggalkan, ia menjadi kamus global. Maknanya, global akan digunakan untuk pemboleh ubah global dan tempatan.
Catatan: Anda boleh menyemak kamus global dan tempatan semasa di Python masing-masing menggunakan kaedah bawaan global () dan penduduk tempatan ().
Contoh 3: Menyampaikan kamus kosong sebagai parameter global
from math import * print(eval('dir()', ())) # The code will raise an exception print(eval('sqrt(25)', ()))
Pengeluaran
('__builtins__') Jejak (panggilan terakhir terakhir): Fail "", baris 5, dicetak (eval ('sqrt (25)', ())) Fail "", baris 1, di NameError: name 'sqrt' tidak ditakrifkan
Sekiranya anda menyampaikan kamus kosong sebagai global, hanya __builtins__
yang tersedia untuk expression
(parameter pertama ke eval()
).
Walaupun kami telah mengimport math
modul dalam program di atas, ekspresi tidak dapat mengakses fungsi yang disediakan oleh modul matematik.
Contoh 4: Menyediakan Kaedah tertentu
from math import * print(eval('dir()', ('sqrt': sqrt, 'pow': pow)))
Pengeluaran
('__builtins__', 'pow', 'sqrt')
Di sini, ungkapan hanya dapat menggunakan sqrt()
dan pow()
kaedah bersama dengan __builtins__
.
Anda juga boleh menukar nama kaedah yang tersedia untuk ungkapan sesuai keinginan anda:
from math import * names = ('square_root': sqrt, 'power': pow) print(eval('dir()', names)) # Using square_root in Expression print(eval('square_root(9)', names))
Pengeluaran
('__builtins__', 'power', 'square_root') 3.0
Dalam program di atas, square_root()
hitung punca kuasa dua menggunakan sqrt()
. Walau bagaimanapun, cuba menggunakan sqrt()
secara langsung akan menimbulkan ralat.
Contoh 5: Mengehadkan Penggunaan terbina dalam
Anda boleh menyekat penggunaan __builtins__
ungkapan seperti berikut:
eval(expression, ('__builtins__': None))
3. Melewati kamus global dan tempatan
Anda boleh menyediakan fungsi dan pemboleh ubah yang diperlukan untuk digunakan dengan menyampaikan kamus penduduk tempatan. Sebagai contoh:
from math import * a = 169 print(eval('sqrt(a)', ('__builtins__': None), ('a': a, 'sqrt': sqrt)))
Pengeluaran
13.0
Dalam program ini, ekspresi boleh mempunyai sqrt()
kaedah dan pembolehubah sahaja. Semua kaedah dan pemboleh ubah lain tidak tersedia.
Mengehadkan penggunaan eval()
dengan menyebarkan kamus global dan tempatan akan menjadikan kod anda selamat terutamanya ketika anda menggunakan input yang diberikan oleh pengguna untuk eval()
kaedah tersebut.
Catatan: Kadang kala, eval()
tidak selamat walaupun dengan nama terhad. Apabila objek dan kaedahnya dapat diakses, hampir semua perkara dapat dilakukan. Satu-satunya cara yang selamat adalah dengan mengesahkan input pengguna.