Встроенная функция Python "компилируется". Для чего его используют?
Сегодня я нашел встроенную функцию compile
. Хотя я читаю документацию, но до сих пор не понимаю ее использования или где она применима. Пожалуйста, объясните, пожалуйста, пример использования этой функции. Я действительно буду признателен за примеры.
Из документации, функция принимает некоторые параметры, как показано ниже.
compile(source, filename, mode[, flags[, dont_inherit]])
Ответы
Ответ 1
Это не так часто используется. Он используется, когда у вас есть исходный код Python в строковой форме, и вы хотите превратить его в объект кода Python, который вы можете сохранить и использовать. Здесь тривиальный пример:
>>> codeobj = compile('x = 2\nprint "X is", x', 'fakemodule', 'exec')
>>> exec(codeobj)
X is 2
В принципе, объект кода преобразует строку в объект, который позже можно вызвать exec
для запуска исходного кода в строке. (Это для режима "exec", режим "eval" позволяет вместо этого использовать eval
, если строка содержит код для одного выражения.) Это не обычная задача, поэтому вы никогда не столкнетесь с необходимостью для него.
Основное его использование - в ситуациях метапрограммирования или внедрения. Например, если у вас есть программа Python, которая позволяет пользователям script ее поведение с пользовательским кодом Python, вы можете использовать compile
и exec
для хранения и выполнения этих пользовательских скриптов.
Еще одна причина, по которой редко используется t23, заключается в том, что, подобно exec
, eval
, и их ilk, compile
является потенциальным дыром в безопасности. Если вы берете код пользователя в строковой форме и компилируете его, а затем выполняете его, вы можете запустить небезопасный код. (Например, представьте, что в моем примере выше код был formatYourHardDrive()
вместо print x
.)
Ответ 2
compile
- это версия более низкого уровня exec
и eval
. Он не выполняет или не оценивает ваши утверждения или выражения, а возвращает объект кода, который может это сделать. Режимы следующие:
-
compile(string, '', 'eval')
возвращает объект кода, который был бы выполнен, если бы вы сделали eval(string)
. Обратите внимание, что вы не можете использовать операторы в этом режиме; допустимо только одно (одно) выражение. Используется для одного выражения.
-
compile(string, '', 'exec')
возвращает объект кода, который был бы выполнен, если бы вы сделали exec(string)
. Здесь вы можете использовать любое количество операторов. Используется для всего модуля.
-
compile(string, '', 'single')
похож на режим exec
, но он будет игнорировать все, кроме первого оператора. Обратите внимание, что оператор if
/else
с его результатами рассматривается как один оператор. Используется для одного оператора.
Посмотрите, что документация. Отличный пример использования также является замечательным (ну, ошарашенным) объяснением http://joequery.me/code/python-builtin-functions/#compile.
Ответ 3
Что конкретно вы не понимаете? В документации объясняется, что она будет:
Скомпилируйте источник в код или объект AST. Объекты кода могут быть выполнены с помощью exec
или оценены по вызову eval()
. source может быть либо строкой Unicode, либо строкой с кодировкой Latin-1, либо объектом AST. Обратитесь к документации модуля ast
для получения информации о том, как работать с объектами AST.
Итак, он берет код python и возвращает эти две вещи
-
exec
выполнит код python
-
eval
будет оценивать выражение, которое менее функционально, чем exec
-
ast
позволяет вам перемещаться по абстрактному дереву синтаксиса, который генерирует код