返回介绍

混合用法模式:__name__ 和 __main__

发布于 2024-01-29 22:24:15 字数 2011 浏览 0 评论 0 收藏 0

这是一个特殊的与模块相关的技巧,可把文件作为成模块导入,并以独立式程序的形式运行。每个模块都有个名为__name__的内置属性,Python会自动设置该属性:

·如果文件是以顶层程序文件执行,在启动时,__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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文