compile()

Функция compile() превращает исходный код в виде строки в объект кода, который потом можно исполнить через exec() или eval(). Используется в шаблонизаторах, REPL’ах, конфигурируемых движках правил.

Сигнатура

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

Параметры:

  • source — строка, байты или AST-узел с исходным кодом.

  • filename — имя файла для сообщений об ошибках (можно "<string>").

  • mode — "exec" (несколько операторов), "eval" (одно выражение), "single" (одна интерактивная строка).

Возвращает: объект кода.

Предупреждение

Исполнение произвольно скомпилированного кода опасно — никогда не принимайте такие строки от пользователя без жёсткой проверки.

Примеры

Режим eval — одно выражение:

code = compile("2 + 3 * 4", "<expr>", "eval")
print(eval(code))
14

Режим exec — несколько операторов:

src = """
total = 0
for i in range(1, 6):
    total += i
"""
code = compile(src, "<calc>", "exec")
ns = {}
exec(code, ns)
print(ns["total"])
15

Кэширование скомпилированного кода:

rules = ["x > 10", "x % 2 == 0", "x < 100"]
compiled = [compile(r, "<rule>", "eval") for r in rules]

def check(value):
    return all(eval(c, {"x": value}) for c in compiled)

print(check(42))
print(check(7))
True
False

Понятные сообщения об ошибках через filename:

try:
    compile("1 + ", "user_input.py", "eval")
except SyntaxError as e:
    print(e.filename, "строка", e.lineno)
user_input.py строка 1

Компиляция многострочного фрагмента и доступ к результату:

src = "print('Запуск из строки')\nresult = 7 * 6"
code = compile(src, "script.py", "exec")
ns = {}
exec(code, ns)
print(ns["result"])
Запуск из строки
42

См. также

Примечание

Описание основано на официальной документации Python (docs.python.org), распространяемой под лицензией PSF License v2. © Python Software Foundation.