eval(), exec() și compile() în Python

Rulează cod Python primit ca text: eval() calculează o expresie, exec() execută instrucțiuni, compile() le pregătește.

Sintaxă
eval(expresie, globals=None, locals=None)
exec(cod, globals=None, locals=None)
compile(sursa, fisier, mod)

Ce face eval(), exec() și compile()

eval("2 + 3 * 4") calculează o expresie și returnează rezultatul. exec() rulează instrucțiuni întregi (atribuiri, bucle, definiții de funcții) și returnează None. compile() transformă textul într-un obiect cod, care poate fi rulat de mai multe ori cu eval sau exec; modul este 'eval', 'exec' sau 'single'.

Atenție: nu folosi niciodată eval sau exec pe text primit de la utilizatori. Pot rula orice cod, inclusiv ștergerea fișierelor. Pentru a citi în siguranță valori Python dintr-un text (liste, numere, dicționare), folosește ast.literal_eval().

Parametri

Parametru Descriere
expresie / cod / sursa Textul cu codul (sau un obiect cod de la compile()).
globals, locals Opțional. Dicționarele cu variabilele vizibile pentru cod.
fisier, mod Pentru compile(): un nume afișat în erori și tipul codului.

Ce returnează

eval: valoarea expresiei. exec: None. compile: un obiect cod.

Exemple

Exemplul 1: eval și exec cu variabile controlate

print(eval("2 + 3 * 4"))
print(eval("x * y", {"x": 6, "y": 7}))

spatiu = {}
exec("def patrat(n):\n    return n * n\nrezultat = patrat(9)", spatiu)
print(spatiu["rezultat"])

Rezultat

14
42
81

Exemplul 2: compile() și alternativa sigură

formula = compile("pret * cantitate", "<formula>", "eval")
for pret, cantitate in [(4.5, 2), (7, 3)]:
    print(eval(formula, {"pret": pret, "cantitate": cantitate}))

import ast
print(ast.literal_eval("[1, 2, {'oras': 'Iași'}]"))

Rezultat

9.0
21
[1, 2, {'oras': 'Iași'}]

Greșeli frecvente

  • Rulezi eval(input()) ca să citești un număr. Un utilizator poate tasta __import__('os').system('...'). Folosește int(input()) sau ast.literal_eval.

Comenzi înrudite

  • repr() și ascii(): Returnează reprezentarea „tehnică” a unei valori, utilă la depanare; ascii() o face doar cu caractere ASCII.
  • globals(), locals() și vars(): Returnează dicționarele cu variabilele globale, cele locale sau atributele unui obiect.
  • import / from ... import: Încarcă un modul (din biblioteca standard, instalat sau scris de tine) ca să îi folosești funcțiile.