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

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

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

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

3 ответов


это не то, что обычно используется. Он используется, когда у вас есть исходный код Python в Строковой форме, и вы хотите сделать его объектом кода Python, который вы можете сохранить и использовать. Вот тривиальный пример:

>>> codeobj = compile('x = 2\nprint "X is", x', 'fakemodule', 'exec')
>>> exec(codeobj)
X is 2

в основном, объект кода преобразует строку в объект, который вы можете позже вызвать exec on для запуска исходного кода в строке. (Это для режима "exec"; режим "eval" позволяет использовать eval вместо этого, если строка содержит код для отдельного выражения.) Это не обычная задача, поэтому вы никогда не столкнетесь с необходимость.

основная польза для его в ситуациях метапрограммировать или врезать. Например, если у вас есть программа Python, которая позволяет пользователям писать свое поведение с помощью пользовательского кода Python, вы можете использовать compile и exec для хранения и выполнения этих пользовательских сценариев.

другая причина compile редко используется, как exec, eval, и иже с ними, compile - это потенциальный дыра в безопасности. Если вы берете код пользователя в Строковой форме и компилируете его, а затем выполняете его, вы можете запустить небезопасный код. (Например, представьте, что в моем примере выше код formatYourHardDrive() вместо print x.)


compile ниже версия уровень exec и eval. Он не выполняет и не оценивает ваши операторы или выражения, но возвращает объект кода, который может это сделать. Режимы следующие:

  1. compile(string, '', 'eval') возвращает объект кода, который был бы выполнен, если бы вы сделали eval(string). Обратите внимание, что вы не может использовать операторы в этом режиме; допустимо только (одно) выражение. Используется для одного выражения.
  2. compile(string, '', 'exec') возвращает код объект, который был бы выполнен, если бы вы сделали exec(string). Здесь можно использовать любое количество инструкций. Используется для всего модуля.
  3. compile(string, '', 'single') как exec mode, но он будет игнорировать все, кроме первого оператора. Обратите внимание, что if/else оператор с его результатами считается одним оператором. Используется для одного оператора.

посмотрите, что документация. Существует также удивительный (ну, тупой вниз) объяснение на http://joequery.me/code/python-builtin-functions/#compile с отличным примером использования.


что конкретно вы не понимаете? В документации поясняется, что это будет:

скомпилируйте источник в код или объект AST. Объекты кода могут быть выполнены с помощью exec заявление или оценивается вызовом eval(). источником может быть строка Unicode, строка в кодировке Latin-1 или объект AST. Обратитесь к ast документация модуля для информации о том, как работать с AST объекты.

поэтому он принимает код python и возвращает эти две вещи

  • exec выполнит код python
  • eval будет оценивать выражение, которое менее функционально, чем exec
  • ast позволяет перемещаться на Абстрактное Дерево Синтаксиса что код генерирует