python中的__main__

在C/C++/Java以及C#中,main函数是程序执行的起点,而作为解释型脚本语言,Python和该类型语言中的大多数一样,没有main函数。Python使用缩进对齐组织代码的执行,所有没有缩进的代码(top-level code),都会在载入时自上而下自动执行。因此,Python程序的起始执行位置是第一行无缩进的代码。

对于单个的小代码片段,这么使用是没有问题的,然而,更多时候,为方便重复利用和更好的组织代码,Python的代码是需要写成更通用的模块(module)的形式来方便调用。

module形式的代码都是写在函数中的,然而有时候我们会遇到这样的情况,就是这些代码可能既能作为某块方便调用,又能作为独立的脚本单独执行。这时就会有这样一种写法出现:

这种写法可以认为是Python实现main函数的一种方式。其中的函数main,也可以是其他任意的,你指定的函数或者代码。

__name__和__main__的含义

  1. __name__

如果是放在Modules模块中,就表示是模块的名字;

如果是放在Classs类中,就表示类的名字;

  1. __main__

如果一个模块被引用,那么模块中__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但如果当作脚本直接运行模块__name__ 的值将是一个特别的值”__main__”。

使用代码来试验

一般来说,我们可以这么写:

直接执行后的结果:

但倘若我们准备复用这个函数,就得将以上代码写到一个文件中供其它地方调用。我们不妨将其保存为myfunc.py中,然后再执行以下代码:

执行结果是:

我们看到,myfunc中的无缩进代码也得到了执行,很明显,作为调用者是不希望这样的。于是,我们需要一种能够区别代码是被调用还是直接执行,这就是前文所说的main函数的实现方式。将myfunc.py中的代码做一改动:

再执行刚才的代码,结果会是:

而我们单独执行myfunc.py时依然能够得到test: max(2,3) == 3这样的结果。

为进一步搞清楚__name__和__main__,我们新建test.py文件,写入如下代码:

直接执行会得到如下结果:

如果执行以下代码来调用test.py:

结果如下:

发表评论

电子邮件地址不会被公开。