Функция compile()
в Python предназначена для определения фрагмента кода внутри функции, помимо этого, она генерирует объект блока кода, который можно использовать для выполнения в любом месте программы.
Возвращенный объект кода может быть выполнен с использованием функции exec()
или eval()
в зависимости от предоставленного режима для создания объекта кода.
Синтаксис:
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
Аргументы:
source
- обязательный аргумент, это исходный код, или строка, байтовая строка, или объект модуля AST, который необходимо скомпилировать.filename
- обязательный аргумент, содержащий код. Он не используется при создании объекта кода, скорее он используется для обеспечения читабельности кода.mode
- этот аргумент указывает тип кода. Допустимые значения: exec, eval и single.- Применяйте
exec
, если источник содержит несколько операторов Python. - Применяйте
eval
, если источник – это одно выражение. - Применяйте
single
, если источник состоит из одного интерактивного оператора.
- Применяйте
Дополнительные аргументы:
flags
- значение по умолчанию 0.dont_inherit
- определяет поток выполнения. Значение по умолчанию False.optimize
- значение по умолчанию -1.
Примеры:
# Источник кода
code_str = 'x=30\ny=25\nprint("Сумма",x - y)'
# Получаемый код
code = compile(code_str, 'sum.py', 'exec')
# Выводим информацию
print(type(code))
exec(code)
Результат:
>>> <class 'code'>
>>> Сумма 5
Ещё один пример, чтение кода из файла. Создам рядом файл code.py со следующим содержимым:
code.py
names_list = ['Владислав', 'Александр', 'Алексей', 'Владимир']
print(names_list)
В основном файле main.py выполню данный код
# Чтение из файла code
with open(file='code.py', mode='r', encoding='utf-8') as source:
code_str = source.read()
code = compile(code_str, 'code.py', 'exec')
exec(code)
Результат:
>>> ['Владислав', 'Александр', 'Алексей', 'Владимир']
Пример с eval()
Давайте рассмотрим пример компиляции выражения Python в код и его выполнения с помощью функции eval()
.
# Пример сравнения
x = 20
code = compile('x == 5', '', 'eval')
result = eval(code)
print(result)
code = compile('x + 5', '', 'eval')
result = eval(code)
print(result)
Результат:
>>> False
>>> 25
Пример с объектом AST
import ast
ast_object = ast.parse("print('Добро пожаловать, дорогой гость!')")
print(type(ast_object))
code = compile(ast_object, filename="", mode="exec")
print(type(code))
exec(code)
Результат:
>>> <class 'ast.Module'>
>>> <class 'code'>
>>> Добро пожаловать, дорогой гость!
С источником байтовой строки
x = 25
bytes_str = bytes('x == 25', 'utf-8')
print(type(bytes_str))
code = compile(bytes_str, '', 'eval')
result = eval(code)
print(result)
Результат:
>>> <class 'bytes'>
>>> True