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șteint(input())sauast.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.