4.4.4 模块的有条件执行

有些 Python 模块是可以直接执行的,一般称为程序或脚本;而另一些 Python 模块中只 包含一些函数定义,本身并没有主程序入口,因而不能执行。标准库就属于后一种模块。有 时我们希望创建一种混合式的模块——既可以作为独立执行的程序,又可以作为被其他程序

导入的库。在 Python 中,混合式模块可以通过在程序入口前加上特定条件而实现。 如所熟知,我们一般都在程序文件的最后加上启动程序的一行语句:

  1. main()

这是对程序入口(主函数 main)的调用,没有这一行,程序文件就不是可执行的文件。这 就是直接执行的模块文件,在窗口系统中用鼠标双击即可启动程序。

Python 在导入一个模块的时候会执行模块中的每一行语句,执行函数定义语句 def 时 就创建相应的函数但并不执行,而最后遇到启动程序的 main 时就启动了整个程序。有时我 们希望导入模块时不要执行整个程序,例如交互环境下测试程序时,通常的做法是先导入模 块,需要执行代码时才去调用 main 或其他函数。要想只导入不执行,当然可以删掉程序入 口 main(),但这又会失去双击执行程序的可能。两全其美的做法是在主程序入口 main 之 前加个条件:

  1. if <条件>:
  2. main()

意思是当条件满足时启动程序,否则不启动程序。问题是条件怎么写?

如果是用 import 导入模块,Python 会将该模块的一个特殊变量 name 的值设置为 模块的名字。例如:

  1. >>> import math
  2. >>> print math.__name__
  3. math

第一行导入模块 math,并将 math 的变量 name 设置为’math’。第二行显示了这个变量的值。

但如果是直接执行模块(如双击模块文件图标等),Python 则将模块的特殊变 量 name 设置为字符串’main’。因此可以通过特殊变量 name 的值来判断模块是被 导入的还是被直接执行的。根据这个底层细节,我们可以将程序文件的最后一行改成:

  1. if __name__ == __main__’:
  2. main()

这样就能确保当程序是直接执行时,main 能启动;当程序是被导入时,忽略 main。