logo

exec() w Pythonie

wykonanie() Funkcja służy do dynamicznego wykonywania programów w języku Python, które mogą być ciągiem znaków lub kodem obiektowym. Jeśli jest to ciąg znaków, jest on analizowany jako zestaw instrukcji Pythona, który jest następnie wykonywany, chyba że wystąpi błąd składniowy, a jeśli jest to kod obiektowy, jest po prostu wykonywany. Musimy uważać, aby instrukcji return nie można było używać poza definicjami funkcji, nawet w kontekście kodu przekazywanego do funkcji exec(). Nie zwraca żadnej wartości, dlatego zwraca Nic .

Składnia exec() Pythona

exec(obiekt[, globalne[, lokalne]])

Parametry:



  • obiekt: Jak już powiedziano, może to być ciąg znaków lub kod obiektowy
  • globale: Może to być słownik, a parametr jest opcjonalny
  • miejscowi: Może to być obiekt mapowania i jest również opcjonalny

Jak exec() działa w Pythonie?

W tym przykładzie możemy zobaczyć dynamiczne wykonanie w Pythonie przy użyciu metodyexec()>funkcjonować. Demonstruje możliwość dynamicznego wykonywania kodu zawartego w obiekcie, prezentując koncepcję dynamicznego wykonywania w Pythonie.

Python3


obraz przeceny



prog>=> 'print('The sum of 5 and 10 is', (5+10))'> exec>(prog)>

>

>

Wyjście

The sum of 5 and 10 is 15>

Ostrzeżenie lub ograniczenia

Przed użyciem jakichkolwiek metod wewnątrz funkcji exec() należy pamiętać o tym, co obsługują wszystkie funkcje exec(). Aby to zobaczyć, możemy użyć funkcji dir().

W tym przykładzie możemy zobaczyć dynamiczne wykonanie w Pythonie jakodir()>funkcja jest wykonywana wewnątrzexec()>funkcję ilustrującą koncepcję dynamicznego wykonania w Pythonie.

Python3




# The math class is used to include all the> # math functions> from> math>import> *> exec>(>'print(dir())'>)>

>

>

Wyjście

['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']>

Parametry globalne i lokalne

Python pozwala nam ograniczyć użycie różnych zmiennych i metod poprzez użycie parametrów globalnych i lokalnych, które mogą nie być potrzebne. Te parametry lokalne i globalne są używane w przypadku zmiennych lokalnych lub globalnych, głównie w słownikach. Parametr globalny przejmuje, jeśli brakuje lokalnego, co oznacza, że ​​globalny może być używany w obu polach. Zobaczmy, jak działa kod przy przekazywaniu tylko parametru globalnego.

Python3




# Here we have passed an empty dictionary> from> math>import> *> exec>(>'print(dir())'>, {})>

>

>

Wyjście

['__builtins__']>

Widzimy zatem, że po przekazaniu pustego słownika jako parametru globalnego wyświetlana jest tylko wartość __builtins__ i nie są wyświetlane żadne inne funkcje matematyczne, jak w poprzednim przykładzie. Oznacza to, że dla parametru object będzie obsługiwana tylko wartość __builtins__. Sugeruje to, że wszystkie inne funkcje obiektu są ograniczone. Aby to udowodnić, spróbujmy popracować z funkcją matematyczną i zobaczmy, co się stanie.

Python3




# An exception will be raised> from> math>import> *> exec>(>'print(factorial(5))'>, {})>

>

>

W tym przykładzie powinno zostać wydrukowane 120 jako wynik, ale zamiast tego wyświetla się Brak danych wyjściowych i zgłasza wyjątek. Chociaż zaimportowaliśmy moduł matematyczny, metoda silnia() nie zadziałała z powodu ograniczeń, które ustawiliśmy, przekazując parametr globalny.
Możemy także zezwolić na wykonanie kilku z wielu funkcji. Załóżmy, że chcemy ograniczyć wszystkie inne moduły matematyczne z wyjątkiem funkcji silnia().

Python3




# factorial() will be executed> from> math>import> *> exec>(>'print(factorial(5))'>, {>'factorial'>:factorial})>

>

>

Wyjście

120>

Możemy także zmienić nazwę tych predefiniowanych metod i nadać im nazwę zdefiniowaną przez użytkownika podczas wykonywania. Możemy zmienić nazwę funkcji z silnia() Do fakt() , który jest zdefiniowany przez użytkownika.

Python3

podzielony przez ciąg Java




# factorial() renamed as fact> from> math>import> *> exec>(>'print(fact(5))'>, {>'fact'>: factorial})>

>

>

Wyjście

120>

W tym scenariuszu, przekazując zarówno parametry globalne, jak i lokalne, możemy dostosować zachowanie wykonywanego kodu do naszych specyficznych wymagań, pokazując wszechstronność dynamicznego wykonywania w Pythonie.

Python3




from> math>import> *> exec>(>'print(dir())'>, {>'built'> : __builtins__}, {>'sum'>:>sum>,>'iter'>:>iter>})>

>

>

Wyjście

['iter', 'sum']>

Dynamiczne wykonanie w Pythonie umożliwia wykonanie określonych metod, takich jaksum()>Iiter()>wraz z metodami wbudowanymi wewnątrzexec()>funkcję, demonstrującą elastyczność dynamicznego wykonywania w Pythonie. Dzięki temu w funkcji exec() można wykonywać tylko metody sumujące i iterowe wraz ze wszystkimi metodami wbudowanymi. Możemy również ograniczyć użycie __builtins__ w ten sposób:

Python3




#__builtins__ has been restricted using None> from> math>import> *> exec>(>'print(dir())'>, {>'__builtins__'> :>None>}, {>'sum'>:>sum>,>'print'>:>print>,>'dir'>:>dir>})>

>

>

Wyjście

['dir', 'print', 'sum']>