Jak korzystać z funkcji Eval i Exec w Python

Jak korzystać z funkcji Eval i Exec w Python

W tym artykule obejmie przewodnik na temat korzystania z funkcji „Eval” i „Exec” dostępnych w standardowej bibliotece Python. Funkcje te mogą być używane na różne sposoby do oceny i wykonywania wyrażeń Pythona. Wykorzystanie obu tych funkcji można najlepiej zrozumieć za pomocą przykładów. Niektóre przykłady są wymienione poniżej. Wszystkie próbki kodu w tym artykule są testowane z Python 3.9.5 na Ubuntu 21.04.

Korzystanie z EACT do oceny wyrażeń Pythona

Funkcję oceny można wykorzystać do oceny wyrażeń Pythona i uzyskania od nich wartości zwrotnej. Wszelkie wyrażenie Pythona, które należy ocenić, jest dostarczane do funkcji oceny w formie obowiązkowego argumentu. Wyrażenia przekazane jako argument funkcji eval mają pełny dostęp do wbudowanych funkcji Pythona, a także globalnych i lokalnych przestrzeni nazwisk. Spójrz na poniższą próbkę kodu:

n = 1
wynik = eval („n * 2”)
Drukuj (wynik)
eval („print (n * 2)”)

Potrójne cytaty w powyższym przykładzie służą do prezentacji ciągów „tak jak jest”, bez ucieczki od znaków specjalnych lub dokonywania innych modyfikacji. Pierwsze stwierdzenie w próbce kodu określa zmienną o nazwie „N” o wartości 1. Następnie metoda oceny jest wywoływana przez dostarczanie jej wyrażenia pythona w formacie ciągów. W wyrażeniu ciągu zmienna „N” została odwołana, ponieważ jest już dostępna w przestrzeni nazw. Następna instrukcja drukuje dane wyjściowe zmiennej „Wynik”. Ostatnie stwierdzenie ilustruje, że możesz bezpośrednio wywołać wbudowane funkcje Pythona w wyrażeniu dostarczonym do funkcji oceny jako argument.

Po uruchomieniu powyższej próbki kodu należy uzyskać następujące dane wyjściowe:

2
2

Jak widać na powyższym wyjściu, oba instrukcje drukowania dają ten sam wynik.

Możesz opcjonalnie dostarczać niestandardowe słowniki dla globalnych i lokalnych przestrzeni nazw do ograniczenia i kontroli Dozwolone obiekty przestrzeni nazw. Spójrz na poniższą próbkę kodu:

n = 1
wynik = eval („n * 2”)
Drukuj (wynik)
eval („print (m * 2)”, 'm': 1)
eval („print (n * 2)”, 'm': 1)

W oświadczeniu oceniającym w czwartym wierszu dostarczany jest dodatkowy argument, w którym używany jest słownik niestandardowych obiektów przestrzeni nazwy globalnej. Kiedy dostarczasz słownik niestandardowych obiektów globalnych, EACT wykorzystywane są tylko wbudowane metody i mapowania zawarte w słowniku. Jeśli używasz pustego słownika globalnego („”), dozwolone są tylko wbudowane metody, a nawet import niestandardowy. Ponieważ obiekt „M” w słowniku globalnym ma wartość 1, instrukcja ocena jest w stanie użyć odniesienia dla „M”. W ostatnim stwierdzeniu obiekt „M” jest dostępny w globalnym słowniku, ale nie w zmiennej „N”, ponieważ dostarczono niestandardowy słownik obiektów globalnych. Ostatnie stwierdzenie rzuci błąd, ponieważ nie ma definicji dla „N” w niestandardowym słowniku globalnym przestrzeni nazw.

Po uruchomieniu powyższej próbki kodu należy uzyskać następujące dane wyjściowe:

2
2
Traceback (najnowsze połączenie ostatnie):
Plik "/home/user/pobieranie/./test.py ", linia 7, w
eval („print (n * 2)”, 'm': 1)
Plik „”, wiersz 1, w
Nameerror: Nazwa „n” nie jest zdefiniowana

Możesz użyć słownika do lokalnych obiektów przestrzeni nazw. Po prostu dostarcz niestandardowy słownik jako trzeci argument dla funkcji eval do użycia go jako mapowania dla lokalnych obiektów przestrzeni nazwy.

Korzystanie z Exec do uruchomienia kodu Pythona

Funkcja EXEC działa podobnie do funkcji oceny z pewnymi różnicami. Wyrażenie dostarczone do funkcji exec może być ciągiem lub dowolnym innym poprawnym obiektem Python, który zawiera prawidłowy kod Pythona. Dla porównania, funkcja eval przyjmuje tylko wyrażenia ciągów. Możesz także dostarczać niestandardowe słowniki zarówno dla obiektów przestrzeni nazw globalnej, jak i lokalnej, a metoda exec zachowuje. Kolejną różnicą w funkcji eval jest to, że funkcja exec zawsze zwraca wartość „brak”. Spójrz na poniższą próbkę kodu:

n = 1
wynik = exec („n * 2”)
Drukuj (wynik)
exec („print (n * 2)”)
wynik = "print (n * 2)"
exec (wynik)

Blok kodu jest bardzo podobny do próbki kodu używanego w przykładzie eval, ale zamiast funkcji eval, teraz zastosowano funkcję exec. Po uruchomieniu powyższej próbki kodu należy uzyskać następujące dane wyjściowe:

Nic
2
2

Jak wspomniano wcześniej, funkcja exec zawsze zwraca wartość „brak”, więc trzecia linia wytwarza „brak” jako wyjście. Następnie instrukcja exec w czwartym wierszu wykorzystuje funkcję „wydruku” do wytworzenia „2” jako wyjścia. Zmienną wyniku przypisuje się następnie nową wartość, dostarczając jej prawidłową instrukcję kodu Python w formie ciągu. Ostatnia instrukcja pokazuje, że funkcja exec może bezpośrednio wywołać obiekty kodu zawierające prawidłowy kod Python. Produkuje również „2” jako wyjście.

Względy bezpieczeństwa

Korzystając z funkcji eval i exec, powinieneś pamiętać, że obie te funkcje umożliwiają wykonywanie dowolnych wyrażeń Python i bloków kodu. Jeśli nie jesteś świadomy tego, co jest używane w wyrażeniach, stwierdzenia te mogą wyrządzić krzywdę środowisku, w którym pracujesz. Na przykład możesz niezamierzony modyfikowanie, usuwanie lub wprowadzanie nieodwracalnych zmian w plikach przechowywanych na hoście za pomocą modułów „OS” i „SYS” oraz ich metod w funkcjach Eval i Exec. Moduł „podprocesowy” w Python umożliwia uruchomienie nowych procesów i uruchamianie poleceń Shell. Wyrażenia w metodach Eval i Exec Używanie modułu podprocesowego mogą prowadzić do niezamierzonych zachowań, jeśli nie jesteś ostrożny w tym, co jest używane w wyrażeniach.

Wniosek

Zarówno metody Eval, jak i Exec umożliwiają przetwarzanie i wykonywanie kawałków kodu Python. Możesz dostarczyć oceny do innych funkcji Pythona jako argumenty, ponieważ zawsze zwracają wartość, nieco podobną do funkcji Lambda w Pythonie. Podobnie możesz użyć funkcji exec do wykonywania predefiniowanego kodu Pythona. Jest najczęściej używany, gdy kod Pythona jest potrzebny do odczytania z jednego pliku i wykonany w innym.