Python eval ()

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 + 1dan printdigunakan 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 osmodul. 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 mathmodul 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.

Artikel menarik...