- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
过渡性模块重载
例如,如果要重载某个模块A,并且A导入模块B和C,重载只适用于A,而不适用于B和C。A中导入B和C的语句在重载的时候重新运行,但是,它们只是获取已经载入的B和C模块对象(假设它们之前已经导入了)。在实际的代码中,文件A.py如下:
默认情况下,这意味着你不能依赖于重载来过渡性地选择程序中的所有模块中的修改;相反,必须使用多次reload调用来独立地更新子部分。对于交互测试的大系统而言,工作量很大。你可以通过在A这样的父模块中添加reload调用,从而设计自己的系统能够自动重载它们的子部分,但是,这会使模块的代码变复杂。
一种更好的办法是,编写一个通用的工具来自动进行过渡性重载,通过扫描模块的__dict__属性并检查每一项的type以找到要重新载入的嵌套模块。这样的一个工具函数应该递归地调用自己,来导航任意形式的导入依赖性链条。模块__dict__属性在前面已介绍过,并且第9章介绍过type调用,我们只需要把两种工具组合起来。
例如,下面列出的模块reloadall.py有一个reload_all函数来自动地重载一个模块,以及该模块导入的每个模块等,所有通往每个导入链条最底端的通路都被考虑到。它使用字典来记录已经重载的模块,递归地遍历导入链条,以及标准库的types模块,该模块直接为内置类型预定义type结果。访问字典的技术在这里用来在导入是递归或冗余的时候避免循环,因为模块对象可以是字典键(正如我们在第5章学习过的,如果我们使用visited.add(module)来插入的话,一个集合将提供类似的功能):
要使用这一工具,导入其reload_all函数并将一个已经载入的模块的名称传递给它。当文件独立地运行,其自测试代码将会测试自己,它必须导入自己,因为它自己的名字并没有在没有一个导入的文件中定义(这段代码在Python 3.0和Python 2.6中都有效,并且打印出相同的输出,因为我们已经在print中使用了+而不是一个逗号):
如下是这个模块对于Python 3.0下的某些标准库模块工作的情况。注意,o s是如何由tkinter导入的,但tkinter在os之前已经导入了sys(如果想要在Python 2.6下测试这段代码,用Tkinter替换tkinter):
如下的会话展示了常规重载和过渡性重载的对比效果——除非使用过渡性工具,否则重载不会选取对两个嵌套的文件的修改:
要更深入地了解,自己研究并体验这个示例,它是你可能想要添加到自己的源代码库中的另一个可导入工具。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论