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.