Python内置函数“compile”。它是用来干什么的?

2024-05-04 13:41:29 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我遇到了一个内置函数^{}。虽然我阅读了文档,但仍然不了解它的用法或适用的地方。请大家举例说明这个函数的用法。我将非常感谢这些例子。

从文档中,函数接受一些参数,如下所示。

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

Tags: 函数文档source用法参数mode地方filename
3条回答

compileexeceval的低级版本。它不执行或计算语句或表达式,而是返回一个可以执行它的代码对象。模式如下:

  1. compile(string, '', 'eval')返回如果完成eval(string)本应执行的代码对象。注意,在此模式下不能使用语句;只有(单个)表达式有效。用于单个表达式。
  2. compile(string, '', 'exec')返回如果完成exec(string)本应执行的代码对象。这里可以使用任意数量的语句。用于整个模块。
  3. compile(string, '', 'single')exec模式类似,但它将忽略除第一条语句之外的所有内容。请注意,if/else语句及其结果被视为单个语句。用于一个语句。

看看documentation。在http://joequery.me/code/python-builtin-functions/#compile还有一个很棒的(好吧,简化了)解释,其中有一个很好的用法示例。

它没有那么常用。当您有字符串形式的Python源代码,并且希望将其变成一个可以保存和使用的Python代码对象时,就会使用它。下面是一个简单的例子:

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

基本上,code对象将一个字符串转换成一个对象,以后可以调用该对象来运行字符串中的源代码。(这是“exec”模式;“eval”模式允许使用eval,如果字符串包含单个表达式的代码。)这不是一个常见的任务,这就是为什么您可能永远不会遇到对它的需要。

它主要用于元编程或嵌入情况。例如,如果有一个Python程序允许用户使用自定义Python代码编写其行为脚本,则可以使用compileexec来存储和执行这些用户定义的脚本。

另一个很少使用compile的原因是,像execeval,和他们一样,compile是一个潜在的安全漏洞。如果采用字符串形式的用户代码并编译它,然后再执行它,则可能运行不安全的代码。(例如,假设在上面的示例中,代码是formatYourHardDrive(),而不是print x。)

你具体不明白什么?文档说明它将:

Compile the source into a code or AST object. Code objects can be executed by an exec statement or evaluated by a call to eval(). source can either be a Unicode string, a Latin-1 encoded string or an AST object. Refer to the ast module documentation for information on how to work with AST objects.

所以它需要python代码,然后返回

  • exec将执行python代码
  • eval将计算一个比exec功能更少的表达式
  • ast允许您导航代码生成的Abstract Syntax Tree

相关问题 更多 >