logo

exec() у Python

exec() Функція використовується для динамічного виконання програм Python, які можуть бути рядком або об’єктним кодом. Якщо це рядок, цей рядок аналізується як набір інструкцій Python, який потім виконується, якщо не виникає синтаксична помилка, а якщо це об’єктний код, він просто виконується. Ми повинні бути обережними, щоб оператори return не використовувалися поза визначеннями функцій, навіть у контексті коду, переданого до функції exec(). Він не повертає жодного значення, тому повертає Жодного .

Синтаксис Python exec().

exec(об’єкт[, глобальні[, локальні]])



Параметри:

  • об'єкт: Як уже було сказано, це може бути рядок або об'єктний код
  • глобальні: Це може бути словник, а параметр необов’язковий
  • місцеві жителі: Це може бути об’єкт відображення, а також необов’язковий

Як працює exec() у Python?

У цьому прикладі ми можемо побачити динамічне виконання в Python за допомогоюexec()>функція. Він демонструє здатність динамічно виконувати код, що міститься в об’єкті, демонструючи концепцію динамічного виконання в Python.

Python3








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

>

>

Вихід

The sum of 5 and 10 is 15>

Попередження або обмеження

Перед використанням будь-яких методів у функції exec() слід пам’ятати про те, які функції підтримують exec(). Щоб переглянути це, ми можемо використати функцію dir().

різниця дат в excel

У цьому прикладі ми можемо побачити динамічне виконання в Python якdir()>функція виконується в межахexec()>функція, що ілюструє концепцію динамічного виконання в Python.

Python3




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

>

>

Вихід

['__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']>

Глобальні та локальні параметри

Python дозволяє нам обмежити використання різних змінних і методів за допомогою глобальних і локальних параметрів, які можуть бути непотрібними. Ці локальні та глобальні параметри використовуються для локальних або глобальних змінних, переважно словників. Глобальний параметр переважає, якщо локальний параметр відсутній, що означає, що глобальний параметр можна використовувати для обох полів. Давайте подивимося, як працює код, передаючи лише глобальний параметр.

Python3




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

10 1 мільйон
>

>

Вихід

['__builtins__']>

Отже, ми бачимо, що при передачі порожнього словника як глобального параметра відображається лише __builtins__ і жодні інші математичні функції не відображаються, як у попередньому прикладі. Це означає, що для параметра об’єкта підтримуватиметься лише __builtins__. Це означає, що всі інші функції об’єкта обмежені. Щоб довести це, давайте спробуємо попрацювати з математичною функцією та подивимось, що станеться.

Python3




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

>

>

Цей приклад повинен був надрукувати 120 як вихідні дані, але натомість він відображає No Output і викликає виняткову ситуацію. Незважаючи на те, що ми імпортували математичний модуль, метод factorial() не спрацював через обмеження, які ми встановили, передаючи глобальний параметр.
Ми також можемо дозволити виконання кількох із багатьох функцій. Припустімо, ми хочемо, щоб усі інші математичні модулі були обмежені, крім функції factorial().

Python3




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

>

>

Вихід

120>

Ми також можемо змінити назви цих попередньо визначених методів і надати їм користувацькі назви під час виконання. Ми можемо змінити назву функції з факториал() до факт() , який визначається користувачем.

Python3




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

>

>

Вихід

120>

У цьому сценарії, передаючи як глобальні, так і локальні параметри, ми можемо налаштувати поведінку виконуваного коду відповідно до наших конкретних вимог, демонструючи універсальність динамічного виконання в Python.

Python3


список ініціалізації python



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

>

>

Вихід

['iter', 'sum']>

Динамічне виконання в Python дозволяє виконувати певні методи, наприкладsum()>іiter()>разом із вбудованими методами всерединіexec()>функція, що демонструє гнучкість динамічного виконання в Python. Завдяки цьому всередині функції exec() можна виконувати лише методи sum та iter разом із усіма вбудованими методами. Ми також можемо обмежити використання __builtins__ так:

Python3




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

>

>

Вихід

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