Python eval ()

Metode eval () mem-parsing ekspresi yang diteruskan ke metode ini dan menjalankan ekspresi python (kode) di dalam program.

Secara sederhana, eval()fungsi menjalankan kode python (yang dilewatkan sebagai argumen) di dalam program.

Sintaksnya eval()adalah:

 eval (ekspresi, global = Tidak ada, penduduk setempat = Tidak ada)

eval () Parameter

The eval()Fungsi mengambil tiga parameter:

  • ekspresi - string diurai dan dievaluasi sebagai ekspresi Python
  • global (opsional) - kamus
  • penduduk setempat (opsional) - objek pemetaan. Kamus adalah tipe pemetaan standar dan umum digunakan dengan Python.

Penggunaan global dan lokal akan dibahas nanti di artikel ini.

Return Value dari eval ()

Metode eval () mengembalikan hasil yang dievaluasi dari ekspresi.

Contoh 1: Bagaimana eval () bekerja dengan Python

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

Keluaran

 2

Di sini, eval()fungsi mengevaluasi ekspresi x + 1dan printdigunakan untuk menampilkan nilai ini.

Contoh 2: Contoh Praktis untuk Mendemonstrasikan 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

Keluaran

 Ketikkan fungsi: hitung Luas (l) Jika panjang adalah 1, Luas = 1 Jika panjang adalah 2, Luas = 4 Jika panjang adalah 3, Luas = 9 Jika panjang adalah 4, Luas = 16

Peringatan saat menggunakan eval ()

Pertimbangkan situasi di mana Anda menggunakan sistem Unix (macOS, Linux dll) dan Anda telah mengimpor osmodul. Modul os menyediakan cara portabel untuk menggunakan fungsionalitas sistem operasi seperti membaca atau menulis ke file.

Jika Anda mengizinkan pengguna untuk memasukkan nilai menggunakan eval(input()), pengguna dapat mengeluarkan perintah ke file perubahan atau bahkan menghapus semua file menggunakan perintah: os.system('rm -rf *').

Jika Anda menggunakan eval(input())kode Anda, sebaiknya periksa variabel dan metode mana yang dapat digunakan pengguna. Anda dapat melihat variabel dan metode mana yang tersedia menggunakan metode dir ().

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

Keluaran

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' comb ',' copysign ',' cos ',' cosh ',' derajat ',' 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 ',' keepder ',' sin ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')

Membatasi Penggunaan Metode dan Variabel yang Tersedia di eval ()

Lebih sering daripada tidak, semua metode dan variabel yang tersedia yang digunakan dalam ekspresi (parameter pertama ke eval()) mungkin tidak diperlukan, atau bahkan mungkin memiliki celah keamanan. Anda mungkin perlu membatasi penggunaan metode dan variabel ini untuk eval(). Anda dapat melakukannya dengan meneruskan parameter global dan lokal opsional (kamus) ke eval()fungsi.

1. Saat parameter global dan lokal dihilangkan

Jika kedua parameter dihilangkan (seperti pada contoh sebelumnya), ekspresi dieksekusi dalam lingkup saat ini. Anda dapat memeriksa variabel dan metode yang tersedia menggunakan kode berikut:

 print(eval('dir()')

2. Meneruskan parameter global; parameter lokal dihilangkan

Parameter global dan lokal (kamus) masing-masing digunakan untuk variabel global dan lokal. Jika kamus lokal dihilangkan, defaultnya adalah kamus global. Artinya, global akan digunakan untuk variabel global dan lokal.

Catatan: Anda dapat memeriksa kamus global dan lokal saat ini dengan Python menggunakan metode bawaan globals () dan local ().

Contoh 3: Meneruskan kamus kosong sebagai parameter global

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

Keluaran

 ('__builtins__') Traceback (panggilan terakhir terakhir): File "", baris 5, tercetak (eval ('sqrt (25)', ())) File "", baris 1, di NameError: name 'sqrt' tak terdefinisi

Jika Anda meneruskan kamus kosong sebagai global, hanya __builtins__yang tersedia untuk expression(parameter pertama ke eval()).

Meskipun kami telah mengimpor mathmodul dalam program di atas, ekspresi tidak dapat mengakses fungsi apa pun yang disediakan oleh modul matematika.

Contoh 4: Menyediakan Metode Tertentu

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

Keluaran

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

Di sini, ekspresi hanya dapat menggunakan sqrt()dan pow()metode bersama dengan __builtins__.

Dimungkinkan juga untuk mengubah nama metode yang tersedia untuk ekspresi 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))

Keluaran

 ('__builtins__', 'power', 'square_root') 3.0

Dalam program di atas, square_root()hitung akar kuadrat menggunakan sqrt(). Namun, mencoba menggunakan sqrt()secara langsung akan menimbulkan kesalahan.

Contoh 5: Membatasi Penggunaan built-in

Anda dapat membatasi penggunaan __builtins__dalam ekspresi sebagai berikut:

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

3. Lulus kamus global dan lokal

Anda dapat membuat fungsi dan variabel yang dibutuhkan tersedia untuk digunakan dengan meneruskan kamus lokal. Sebagai contoh:

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

Keluaran

 13.0

Dalam program ini, ekspresi hanya dapat memiliki sqrt()metode dan variabel a. Semua metode dan variabel lain tidak tersedia.

Membatasi penggunaan eval()dengan melewatkan kamus global dan lokal akan membuat kode Anda aman terutama saat Anda menggunakan masukan yang diberikan oleh pengguna ke eval()metode tersebut.

Catatan: Terkadang, eval()tidak aman bahkan dengan nama yang terbatas. Ketika sebuah objek dan metodenya dibuat dapat diakses, hampir semua hal bisa dilakukan. Satu-satunya cara yang aman adalah dengan memvalidasi input pengguna.

Artikel yang menarik...