Подтвердить что ты не робот

Встроенная функция Python "компилируется". Для чего его используют?

Сегодня я нашел встроенную функцию compile. Хотя я читаю документацию, но до сих пор не понимаю ее использования или где она применима. Пожалуйста, объясните, пожалуйста, пример использования этой функции. Я действительно буду признателен за примеры.

Из документации, функция принимает некоторые параметры, как показано ниже.

compile(source, filename, mode[, flags[, dont_inherit]])
4b9b3361

Ответ 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 позволяет вам перемещаться по абстрактному дереву синтаксиса, который генерирует код