Python内置函数" compile"。它是干什么用的?

时间:2014-03-16 22:29:24

标签: python built-in

我今天遇到了内置函数compile。虽然我阅读了文档,但仍然不了解它的用法或适用的地方。请允许任何人用例子解释这个功能的使用。我会非常感激的例子。

从文档中,该函数采用如下所示的一些参数。

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

3 个答案:

答案 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程序,您可以使用compileexec来存储和执行这些用户定义的脚本。

很少使用compile的另一个原因是execeval及其同类,compile是潜在的安全漏洞。如果你以字符串形式获取用户代码并编译它然后执行它,你可能会运行不安全的代码。 (例如,假设在上面的示例中代码是formatYourHardDrive()而不是print x。)

答案 1 :(得分:14)

compileexeceval的较低级别版本。它不会执行或评估您的语句或表达式,而是返回可以执行此操作的代码对象。模式如下:

  1. compile(string, '', 'eval')返回在您完成eval(string)后已执行的代码对象。请注意,不能在此模式下使用语句;只有(单个)表达式有效。用于单个表达式。
  2. compile(string, '', 'exec')返回在您完成exec(string)后已执行的代码对象。您可以在此处使用任意数量的语句。用于整个模块。
  3. compile(string, '', 'single')exec模式类似,但除了第一个语句外,它将忽略所有内容。请注意,带有结果的if / else语句被视为单个语句。用于单一陈述。
  4. 看看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