Встроенная функция 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
. Он не выполняет и не оценивает ваши операторы или выражения, но возвращает объект кода, который может это сделать. Режимы следующие:
-
compile(string, '', 'eval')
возвращает объект кода, который был бы выполнен, если бы вы сделалиeval(string)
. Обратите внимание, что вы не может использовать операторы в этом режиме; допустимо только (одно) выражение. Используется для одного выражения. -
compile(string, '', 'exec')
возвращает код объект, который был бы выполнен, если бы вы сделалиexec(string)
. Здесь можно использовать любое количество инструкций. Используется для всего модуля. -
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
позволяет перемещаться на Абстрактное Дерево Синтаксиса что код генерирует