Автор оригинала: Pankaj Kumar.
Понимание метода Python Exec ()
Итак, сегодня в этом руководстве, давайте узнаем о Метод Python Exec () в Python Отказ
Метод Python Exec ()
В основном, Python EXEC ()
Способ выполняет пропущенный набор кода в виде строки. Это очень полезно, так как практически поддерживает динамическое выполнение. Синтаксис для метода приведен ниже.
exec(object, globals, locals)
Здесь объект
Может быть строка, открытый файл объект или объект кода.
- Для строки – Строка анализируется как набор операторов Python, который затем выполняется (если не возникает ошибка синтаксиса).
- Для открытого файла – Файл анализируется до EOF и выполняется.
- Для кода объекта – Это просто выполняется.
И два дополнительных аргумента глобал
и Местные жители
должно быть Словари используется для глобальных и локальных переменных.
Теперь, когда у нас уже есть основная идея EXEC ()
Метод, давайте попробуем понять, что это работает через пример.
>>> exec("print('Hey!')") Hey! >>> exec("print(6+4)") 10
Понятно из вышеуказанного фрагмента кода, Печать ()
Заявления успешно выполнены EXEC ()
метод, и мы получаем желаемые результаты.
Работа с методом Python Exec ()
Теперь давайте прыгаем прямо в некоторые примеры, исследующие, как EXEC ()
Метод работает в Python с и без глобал
и Местные жители
Параметры.
1. Без глобальных и локальных параметров
В предыдущем примере мы просто выполняли какой-то набор инструкций в Python, передавая аргумент объекта для EXEC ()
метод. Но мы не видели имена в текущем объеме.
Теперь будем использовать dir () Способ получения списка текущих методов и имен с Математика
Модуль включен перед вызовом EXEC ()
метод.
from math import * exec("print(pow(2, 5))") exec("print(dir())")
Выход:
32.0 ['__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 EXEC ()
метод.
Это поднимает большую проблему безопасности, думая о выполнении Динамический код Python Отказ Пользователь может включать в себя некоторые модули для доступа к командам системы, которые даже могут сбояться с компьютером. Используя глобал
и Местные жители
Параметры, которые мы можем буквально ограничить EXEC ()
Выйти за пределы методов, которые мы хотим получить доступ.
2. С параметром глобалей
Теперь давайте посмотрим, как мы можем использовать Python EXEC ()
Метод с глобал параметр. Python позволяет нам пройти и указывать только методы, которые мы хотим EXEC ()
Способ доступа (в виде словаря) из Встроенный модуль.
def squareNo(a): return a*a exec('print(squareit(10))',{"__builtins__":{"squareit": squareNo, "print": print}}) exec("print(dir())")
Выход:
100 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'squareNo']
В указанном выше коде мы прошли словарь, содержащий методы Squareno ()
(Сопоставлено на пользовательское имя Square ) и Печать ()
Отказ Примечание, используя любой другой метод из Встроенный Метод поднимет Типеррор
Отказ
3. С параметром Locals
Когда мы пройдем только Местный
Параметр ( Словарь ) по умолчанию все Встроенный Методы также доступны до тех пор, пока мы не исключаем их явно не исключаем.
Посмотрите на пример ниже, хотя мы указали Местные жители
Словарь всех Встроенный и Математика Методы модуля доступны в текущем объеме.
from math import * def squareNo(a): return a*a #global And local parameters exec('print(pow(4,3))', {"squareit": squareNo, "print": print}) exec("print(dir())")
Выход:
64 ['__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', 'squareNo', 'tan', 'tanh', 'tau', 'trunc']
Следовательно, теперь явно исключая Встроенные Отказ
from math import * def squareNo(a): return a*a #explicitly excluding built-ins exec('print(pow(4,3))', {"__builtins__": None},{"squareit": squareNo, "print": print}) exec("print(dir())")
Выход:
Traceback (most recent call last): File "C:/Users/sneha/Desktop/test.py", line 7, inexec('print(pow(4,3))', {"__builtins__": None},{"squareit": squareNo, "print": print}) File " ", line 1, in TypeError: 'NoneType' object is not subscriptable
В коде выше, ограничивая EXEC ()
Способ использования только прохожденных ( local ) методы практически делает POW ()
метод недоступный. Следовательно, во время бега мы получаем Типеррор
Отказ
exec () vs eval () в python
Существует два основных различия между Eval ()
и EXEC ()
Методы, даже если почти не выполняют ту же работу.
- Eval () может выполнить только одно выражение, тогда как EXEC () Может использоваться для выполнения динамически созданного оператора или программы, которая может включать петли,
Если-ж
Заявления, функция иКласс
Определения, - Eval () Возвращает значение после выполнения определенного выражения, тогда как EXEC () в основном ничего не возвращается и просто игнорирует значение.
Заключение
Так что это за сегодня. Надеюсь, у вас было четкое понимание работоспособности, используя Python EXEC ()
метод.
Для любого дальнейшего питона EXEC ()
Связанные вопросы, не стесняйтесь спрашивать в комментариях ниже.
использованная литература
- Заявление Exec – Документация Python,
- В чем разница между Eval, Exec и компиляцией? – Вопрос переполнения стека,
- Python Exec () – GrouleDev Post.