eval() dan exec()
Jalankan string sebagai kode — kekuatan besar, risiko besar.
Pahami konsepnya
eval(teks) mengevaluasi EKSPRESI string dan mengembalikan hasilnya: eval("2 + 3") memberi 5. exec(blok) menjalankan STATEMENT string: exec("for i in range(3): print(i)") mencetak 0 1 2. Keduanya menjalankan kode Python dari teks saat runtime.
Bahayanya nyata: eval(input()) pada program yang dijalankan pengguna memberi mereka akses mengeksekusi kode APA PUN di mesinmu — membaca berkas, menghapus data, memasang backdoor. Aturan emas: JANGAN PERNAH eval/exec input yang tidak kamu kendalikan penuh.
Kegunaan yang sah: kalkulator ekspresi matematika dengan sanitasi ketat, plugin system yang memuat kode terpercaya, dan REPL. Untuk kasus kebanyakan, ast.literal_eval() adalah alternatif aman — hanya menerima literal Python (angka, string, list, dict) tanpa eksekusi kode.
Coba contoh kode
import ast
# eval: ekspresi
print(eval("2 ** 10"))
print(eval("len([1, 2, 3])"))
# exec: statement
exec("x = 42\nprint(x)")
# alternatif aman: ast.literal_eval
teks = "[1, 2, 3]"
data = ast.literal_eval(teks)
print(data, type(data))eval cocok untuk ekspresi tunggal; exec untuk blok. ast.literal_eval hanya menerima literal (list, dict, angka, string) dan MENOLAK ekspresi seperti __import__ — pengganti aman saat data berasal dari luar.
Latihan singkat
Uji: eval("2 ** 10") harus `1024`.