- 译者序
- 前言
- 第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 各部分练习题的解答
- 作者介绍
- 封面介绍
混合用法模式:__name__ 和 __main__
·如果文件是以顶层程序文件执行,在启动时,__name__就会设置为字符串"__main__"。
·如果文件被导入,__name__就会改设成客户端所了解的模块名。
结果就是模块可以检测自己的__name__,来确定它是在执行还是在导入。例如,假设我们建立下面的模块文件,名为runme.py,它只导出了一个名为tester的函数。
这个模块定义了一个函数,让用户可以正常地导入并使用:
然而,这个模块也在末尾包含了当此文件以程序执行时,就会调用该函数的代码:
实际上,一个模块的__name__变量充当一个使用模式标志,允许它编写成一个可导入的库和一个顶层脚本。尽管简单,我们将会看到这一钩子几乎在可能遇到的每个Python程序文件中应用。
也许使用__name__测试最常见的就是自我测试代码。简而言之,可以在文件末尾加个__name__测试,把测试模块导出的程序代码放在模块中。如此一来,你可以继续导入,在客户端使用该文件,而且可以通过检测其逻辑在系统shell中(或其他启动方式)运行它。实际上,在文件末端的__name__测试中的自我测试程序代码,可能是Python中最常见并且是最简单的单元测试协议(第35章讨论其他用于测试Python程序代码的常用选项,要知道,unittest和doctest标准库模块,提供更为高级的测试工具)。
编写既可以作为命令行工具也可以作为工具库使用的文件时,__name__技巧也很好用。例如,假设用Python编写了一个文件寻找脚本。如果将其打包成一些函数,而且在文件中加入__name__测试,当此文件独立执行时,就自动调用这些函数,这样就能提高代码的利用效率。如此一来,脚本的代码就可以在其他程序中再利用了。
以__name__进行单元测试
实际上,我们已经在本书的一个实例中看到了__name__检查的有用之处。第18章讨论参数那一节,我们编写了一个脚本,从一组传进来的参数中计算出其最小值。
这个脚本在末端包含了自我测试程序代码。所以不用每次执行时,都得在交互模式命令行中重新输入所有代码就可以进行测试。然而,这种写法的问题在于,每次这个文件被另一个文件作为工具导入时,都会出现调用自我测试所得到的输出:这可不是用户友好的特性!改进之后,我们在__name__检查区块内封装了自我测试的调用,使其在文件作为顶层脚本执行时才会启动,而导入时则不会。
我们也在顶端打印__name__的值,目的是来跟踪它的值。Python开始加载文件时,就创建了这个用法模式的变量并对其赋值。当以顶层脚本执行这个文件的时候,它的名称就会设置为__main__,所以,它的自我测试程序代码会自动执行。
但是,如果我们导入这个文件,其名称不是__main__,就必须明确地调用这个函数来执行。
同样地,无论这是否用于测试,结果都是让代码有两种不同的角色:作为工具的库模块,或者是作为可执行的程序。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论