我今天遇到了内置函数compile
。虽然我阅读了文档,但仍然不了解它的用法或适用的地方。请允许任何人用例子解释这个功能的使用。我会非常感激的例子。
从文档中,该函数采用如下所示的一些参数。
compile(source, filename, mode[, flags[, dont_inherit]])
答案 0 :(得分:50)
这不是常用的。当您使用字符串形式的Python源代码时,可以使用它,并且您希望将其变为可以保留和使用的Python代码对象。这是一个微不足道的例子:
>>> codeobj = compile('x = 2\nprint "X is", x', 'fakemodule', 'exec')
>>> exec(codeobj)
X is 2
基本上,代码对象将字符串转换为对象,稍后可以调用exec
来运行字符串中的源代码。 (这适用于" exec"模式;" eval"模式允许使用eval
,如果字符串包含单个表达式的代码。)这不是常见的任务,这就是为什么你可能永远不会满足它的需要。
它的主要用途是元编程或嵌入情境。例如,如果您有一个允许用户使用自定义Python代码编写脚本行为的Python程序,您可以使用compile
和exec
来存储和执行这些用户定义的脚本。
很少使用compile
的另一个原因是exec
,eval
及其同类,compile
是潜在的安全漏洞。如果你以字符串形式获取用户代码并编译它然后执行它,你可能会运行不安全的代码。 (例如,假设在上面的示例中代码是formatYourHardDrive()
而不是print x
。)
答案 1 :(得分:14)
compile
是exec
和eval
的较低级别版本。它不会执行或评估您的语句或表达式,而是返回可以执行此操作的代码对象。模式如下:
compile(string, '', 'eval')
返回在您完成eval(string)
后已执行的代码对象。请注意,不能在此模式下使用语句;只有(单个)表达式有效。用于单个表达式。compile(string, '', 'exec')
返回在您完成exec(string)
后已执行的代码对象。您可以在此处使用任意数量的语句。用于整个模块。compile(string, '', 'single')
与exec
模式类似,但除了第一个语句外,它将忽略所有内容。请注意,带有结果的if
/ else
语句被视为单个语句。用于单一陈述。看看documentation。在http://joequery.me/code/python-builtin-functions/#compile处还有一个很棒的(好的,愚蠢的)解释,有一个很好的使用示例。
答案 2 :(得分:6)
具体你不明白什么?文档说明它将:
将源代码编译为代码或AST对象。代码对象可以由
exec
语句执行,也可以通过调用eval()
进行评估。 source可以是Unicode字符串,Latin-1编码字符串或AST对象。有关如何使用AST对象的信息,请参阅ast
模块文档。
所以它需要python代码,并返回这两件事
exec
将执行python代码eval
将评估一个表达式,该表达式的功能不如exec
ast
可让您浏览代码生成的Abstract Syntax Tree