eval函数仅仅允许执行简单的表达式。对于更大的代码块时,使用compileexec函数。

例子:使用 compile函数验证语法

NAME = "script.py"

BODY = """
prnt 'owl-stretching time'
""" try:
compile(BODY, NAME, "exec")
except SyntaxError, v:
print "syntax error:", v, "in", NAME

结果如下:

syntax error: invalid syntax in script.py

当成功时,compile函数返回一个代码对象,你能够使用exec来执行他。

BODY = """
print 'the ant, an introduction'
""" code = compile(BODY, "<script>", "exec") print code exec code

结果如下:

<code object ? at 8c6be0, file "<script>", line 0>
the ant, an introduction

为了能够快速的生成代码,你可以使用下面例子中的类。使用write方法来添加状态,indent和**dedent **来添加结构,这个类能够方便的让其他类进行调用。

import sys, string

class CodeGeneratorBackend:
"Simple code generator for Python" def begin(self, tab="\t"):
self.code = []
self.tab = tab
self.level = 0 def end(self):
self.code.append("") # make sure there's a newline at the end
return compile(string.join(self.code, "\n"), "<code>", "exec") def write(self, string):
self.code.append(self.tab * self.level + string) def indent(self):
self.level += 1
# in Python 1.5.2 and earlier, use this instead:
# self.level = self.level + 1 def dedent(self):
if self.level == 0:
raise SyntaxError, "internal error in code generator"
self.level -= 1
# in Python 1.5.2 and earlier, use this instead:
# self.level = self.level - 1 #
# try it out! c = CodeGeneratorBackend()
c.begin()
c.write("for i in range(5):")
c.indent()
c.write("print 'code generation made easy!'")
c.dedent()
exec c.end()

结果如下:

code generation made easy!
code generation made easy!
code generation made easy!
code generation made easy!
code generation made easy!

python也提供了execfile的函数,他能够方便的从文件中加载代码,并编译和执行。如下的例子是如何使用这个函数。

execfile("hello.py")

def EXECFILE(filename, locals=None, globals=None):
exec compile(open(filename).read(), filename, "exec") in locals, globals EXECFILE("hello.py")

结果如下:

hello again, and welcome to the show
hello again, and welcome to the show

在这个例子中 hello.py的代码如下:

print "hello again, and welcome to the show"

从__builtin__ 的模块中重载函数。

因为python是在验证局部和模块名称空间后才进行查看内建函数,在这种情况下你需要特别的引用__builtin__ 模块。在如下的例子脚本中,重载open一个版本函数,这个版本中能够打开一个普通文件验证是不是以一个“特殊”的字符串开始。为了能够使用原始的open函数,需要明确的引用模块名称。

def open(filename, mode="rb"):
import __builtin__
file = __builtin__.open(filename, mode)
if file.read(5) not in("GIF87", "GIF89"):
raise IOError, "not a GIF file"
file.seek(0)
return file fp = open("samples/sample.gif")
print len(fp.read()), "bytes" fp = open("samples/sample.jpg")
print len(fp.read()), "bytes"

结果如下:

3565 bytes
Traceback (innermost last):
File "builtin-open-example-1.py", line 12, in ?
File "builtin-open-example-1.py", line 5, in open
IOError: not a GIF file

转载请标明来之:http://www.bugingcode.com/

更多教程:阿猫学编程

python标准库-builtin 模块之compile,execfile的更多相关文章

  1. [python标准库]Pickle模块

    Pickle-------python对象序列化 本文主要阐述以下几点: 1.pickle模块简介 2.pickle模块提供的方法 3.注意事项 4.实例解析 1.pickle模块简介 The pic ...

  2. Python 标准库 ConfigParser 模块 的使用

    Python 标准库 ConfigParser 模块 的使用 demo #!/usr/bin/env python # coding=utf-8 import ConfigParser import ...

  3. Python标准库——collections模块的Counter类

    1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...

  4. [python标准库]XML模块

    1.什么是XML XML是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.您可以创建内容,然后使用限定标记标记它,从而使每个单词. ...

  5. 【python】Python标准库defaultdict模块

    来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...

  6. Python标准库--os模块

    这个模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux和Windows下运行.一个例 ...

  7. python标准库 bisect模块

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #bisect #作用:维护有序列表,而不必在每次向列表增加一个元素 ...

  8. python标准库 sysconfig模块

    # -*- coding: utf-8 -*-# python:2.x__author__ = 'Administrator'import sysconfig#sysconfig:解释器编译时配置#作 ...

  9. Python标准库 -- UUID模块(生成唯一标识)

    UUID是什么: UUID: 通用唯一标识符 ( Universally Unique Identifier ),对于所有的UUID它可以保证在空间和时间上的唯一性,也称为GUID,全称为: UUID ...

随机推荐

  1. 吴裕雄--天生自然GPU配置:查看本机显卡是否支持GPU

    NVIDIA的GF8级别以上的显卡才能支持physx物理加速(即GPU加速),ATI的显卡不支持. 打开:设备管理器,点击:显示适配器

  2. 吴裕雄--天生自然 PYTHON3开发学习:基本数据类型

    #!/usr/bin/python3 counter = 100 # 整型变量 miles = 1000.0 # 浮点型变量 name = "runoob" # 字符串 print ...

  3. 01 语言基础+高级:1-5 常用API第二部分_day01.【Object类、常用API: Date类、System类、StringBuilder类】

    day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 java.lang.O ...

  4. springboot+mybatis+通用mapper+多数据源(转载)

    1.数据库准备 数据库表我们在springboot-mybatis数据之外,新建数据库springboot-mybatis2: springboot-mybatis数据库中有t_class表: spr ...

  5. pandas(二)

    1.Series序列 一维的数组数据,构建是传二维数据会报错,数据具有索引,构建时如果不传索引,默认为数字rang索引. series存在列名和索引,sr.at[0]是通过列名来定位数据(iat定位行 ...

  6. ZJNU 1262 - 电灯泡——中高级

    在影子没有到达墙角前,人越远离电灯,影子越长,所以这一部分无需考虑 所以只需要考虑墙上影子和地上影子同时存在的情况 因为在某一状态存在着最值 所以如果以影子总长与人的位置绘制y-x图像 会呈一个类似y ...

  7. 注册服务和发现服务 Eureka

    来自蚂蚁课堂: 注册服务和发现服务 1.原理如图: 注册中心负载均衡: 实践 注册中心 集群:

  8. centos7 安装gdb (调试nginx)

    首先卸载原有的gdb,sudo yum remove gdb 从gnu官网下载最新的gdb源文件,wget http://mirrors.ustc.edu.cn/gnu/gdb/gdb-7.9.1.t ...

  9. MySQL数据库中索引的数据结构是什么?(B树和B+树的区别)

    B树(又叫平衡多路查找树) 注意B-树就是B树,-只是一个符号. B树的性质(一颗M阶B树的特性如下) 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3 ...

  10. Sqlite教程(4) Activity

    之前我们已经有了DbHelper.Data Access Object.Configuration. 那麽现在就是由Activity去创建它们,然後就可以存取Sqlite. 架构图表示了它们的关系. ...