Функция
compile()
в Python используется для компиляции исходного кода в объект кода, который затем можно выполнить с помощью функцииexec()
илиeval()
.
Это может быть полезно в ситуациях, когда вам необходимо выполнить код, представленный в виде строки, или когда вы хотите подготовить код для повторного использования.
Функция compile()
имеет следующий синтаксис:
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
Аргументы функции:
source
: Строка или объект AST (Abstract Syntax Tree), представляющий исходный код.filename
: Имя файла, из которого был прочитан код. Если он не был прочитан из файла, вы можете использовать значение, которое будет иметь смысл для вас.mode
: Определяет, как исходный код должен быть скомпилирован. Может быть exec
(если исходник состоит из последовательности операторов), eval
(если исходник состоит из единственного выражения) или single
(если исходник состоит из одного интерактивного оператора).flags
и dont_inherit
(опционально): Позволяют контролировать, какие будут доступны будущие операторы и опции компиляции.optimize
(опционально): Определяет уровень оптимизации компилятора.compile()
возвращает объект кода.Вот базовый пример того, как можно использовать функцию compile()
:
code_str = 'print("Hello, world!")'
code = compile(code_str, 'hello.py', 'exec')
exec(code)
#Hello, world!
Использование с eval()
Вы также можете использовать compile()
с функцией eval()
, если ваш исходный код содержит только одно выражение:
expr_str = '2 + 2'
expr_code = compile(expr_str, 'maths.py', 'eval')
result = eval(expr_code)
print(result)
#4
Использование с single
Используйте режим single
для кода, состоящего из одного оператора, который вы хотите выполнить в интерактивном режиме:
single_str = 'name = "Alex"'
single_code = compile(single_str, 'input.py', 'single')
exec(single_code)
print(name)
#Alex
Если вам нужно многократно выполнять определенный фрагмент кода, может быть полезно скомпилировать его с помощью compile()
, чтобы затем многократно выполнять уже подготовленный объект кода:
loop_str = '''
for i in range(5):
print(i)
'''
loop_code = compile(loop_str, 'loop.py', 'exec')
# Можно выполнить этот код многократно без дополнительной компиляции
for _ in range(3):
exec(loop_code)
#0
#1
#2
#3
#4
#0
#1
#2
#3
#4
#0
#1
#2
#3
#4
Функция compile()
принимает несколько дополнительных аргументов, позволяющих контролировать процесс компиляции.
Опция flags
позволяет включить специфические флаги компилятора. Эти флаги можно комбинировать, используя оператор побитового ИЛИ |
.
import ast
code_str = """
from __future__ import print_function
print("Hello, world!")
"""
# Использование флага __future__
code = compile(code_str, 'hello.py', 'exec', flags=ast.PyCF_TYPE_COMMENTS)
exec(code)
#Hello, world!
Функция compile()
может генерировать исключения, если что-то пошло не так во время компиляции. Например, SyntaxError
будет сгенерирован, если исходный код содержит синтаксическую ошибку.
try:
code = compile("print('Hello, world!'", '<string>', 'exec')
except SyntaxError:
print("There was a syntax error in the code.")
Помимо этого, TypeError
будет сгенерирован, если аргументы, переданные в compile()
, не являются правильными.
try:
code = compile(12345, '<string>', 'exec')
except TypeError:
print("An argument was of the wrong type.")
Функция compile()
в Python предоставляет удобный способ компилировать исходный код в объект кода, который затем можно выполнить с помощью функции exec()
или eval()
. Это полезно в ситуациях, когда вам нужно выполнить код, представленный в виде строки, или когда вы хотите подготовить код для повторного использования.
Содержание: