【整理】Python中的__name__和__main__含义详解

背景

在写Python代码和看Python代码时,我们常常可以看到这样的代码:
def main():
……
if __name == “main“:
main();
其中的函数名main,也可以是其他任意的,你所设置的名字。
这里,就出现了,我们此处所要解释的
namemain

用代码来演示namemain的含义和用法

文字解释,还是很容易糊涂的,下面就来借用一个这里:
What is ‘if name == “main”‘ for?
的代码来详细解释一下。
作为普通的代码,我们是可以这么写的:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

对应的,运行结果也是很正常的:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

但是呢,往往我们所见到的,和我们以后自己也会遇到的,自己写的,有条理的,可复用的做法,那肯定是
那对应的square等函数,专门放到一个文件中,然后被别人调用,此时,就是这样的:
对应的模块文件是mymath.py,里面有我们实现的函数square:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

然后别的python文件
name___and___main.py中,导入此mymath模块,然后使用其square函数:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

然后运行结果是:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

此处,我们看到了,也同时出现了,原本用于mymath.py中去测试square函数的打印结果:

test: square(42) == 1764

而这样的内容,很明显,是作为我模块的调用者,不希望看到的。也不关心的。

此时,我们所希望的是:

作为模块mymath.py本身,希望有自己的相关的调试的代码,用于调试自己模块函数,演示如何使用等等代码;

但是又不希望在被别的,本模块的调用者,所执行到,所看到;

此时,就可以用上述的
main来实现了:

把mymath.py改为:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

此时:

  1. 作为mymath.py本身,自己运行时,可以运行到此处的代码,调试,验证自己的函数square执行的是否正确:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

2.同时,作为mymath.py的调用者name___and___main.py,在import mymath的时候,也不会看到对应的代码执行的结果了:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

其中的main,就是:
作为模块mymath.py本身:
 作为脚本自己去运行的话,对应的模块名,就是上面所解释的,始终叫做main
  关于这点,上述代码已经验证过了。因为mymath.py中的name,就是对应的,内置的变量,通过判断,的确是main,然后才会去执行到对应的模块的测试代码的。
 如果被当做一个模块被别人调用的时候,对应的模块mymath.py的模块名,就是mymath;
  关于这点,我们可以来验证一下,把name___and___main.py改为:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

再去运行,就可以看到输出的结果是mymath了:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

示例2

另外,这里:
A Byte of Python – A module’s name
也有个例子,相对更加简洁,需要的可以参考一下。
摘录其代码如下:

《【整理】Python中的__name__和__main__含义详解》 Paste_Image.png

【总结】

name:表示模块,类等的名字;

main:模块,xxx.py文件本身:

 被直接执行时,对应的模块名就是
main

  可以在

  if
name == “
main”:

  中添加你自己想要的,用于测试模块,演示模块用法等代码。

 作为模块,被别的Python程序导入(import)时,模块名就是本身文件名xxx了。

总的来说,即:
python文件本身自己运行时,显示的是:This program is being run by itself
Python文件被别人import导入时,显示的是:I am being imported from another module

    原文作者:小黑大大
    原文地址: https://www.jianshu.com/p/3d8ab4321ef3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞