Python中`__name__`有什么用
2021-02-18
注: 有的读者在学习《Python大学实用教程》第7章模块和包$^{[2]}$时,对变量__name__
感到困惑,现补充解释。
与本书更多的有关资料,请访问:http://www.itdiffer.com/python_course.html
在Python程序中,你会经常看到__name__
,例如:
1 | if __name__ == '__main__': |
本文将介绍如何正确使用和理解这个变量。
请注意,__name__
在程序中是一个变量,只不过这个变量的命名有点奇怪,用双下划线开头和结尾。这种命名的方法,在Pyhton的类对象设计中,常常用于一些具有特殊作用的属性或者方法名称$^{[2]}$。
如果将编写的一个Python文件,即.py
为扩展名的文件,作为模块被其他程序引入的时候,我们需要通过__name__
这个变量,决定在引入的时候是否要运行该文件。
例如创建一个文件namescript.py
,内容如下:
1 | def my_function(): |
如果执行namescript.py
文件,其执行流程如下:
在程序中的代码被执行之前,Python解析器先给__name__
变量赋值为__main__
。然后逐行执行程序中的代码。注意,当执行到第7行的时候,判断__name__
的值是否为__main__
,如果条件为真,就执行main()
这个前面自定义的函数,并最终打印出结果。
如果将namescript.py
文件作为一个模块,在另外一个文件中引入,例如在名为importingscript.py
的文件中,有代码:
1 | import namescript as ns |
这样,就在importingscript.py
文件中使用了namescript.py
文件中定义的函数my_function
。如此,避免了重复代码,而且提升了开发效率。这是Python语言的重要特点。
如果执行importscript.py
文件,其流程如下图所示:
在importscript.py
中,变量__name__
被赋值为__main__
,然后执行import namescript
,Python解析器会自动在模块名字后面增加.py
并在检索目录中查找该文件——所以,在引入模块的时候不要写成import namescript.py
。找到了,就引入该文件中的所有代码。
然后,将namescript.py
文件所运行的空间中的__name__
设置为namescript
。结合上图,在importingscript.py
和namescript.py
中,分别有两个同名的__name__
变量,但是,它们的值不同。如此,在namescript.py
中,因为__name__
的值是namescript
了,于是该文件中的if __name__ == "__main__"
条件不再成立,所以此条件下的main()
函数不再执行。
在importingscript.py
中,调用了namescript.my_function()
,打印的结果是:the value of __name__ is namescript
,这里的__name__
当然是namescript.py
中的变量。
如果在importingscript.py
中,增加print(__name__)
,打印出来的结果应该是__main__
。
本文内容作为《Python大学实用教程》第7章的补充和拓展,从而理解__name__
变量的作用及其在模块编写中的应用效果。
参考文献:
[1]. https://medium.com/free-code-camp/whats-in-a-python-s-name-506262fe61e8
[2]. Python大学实用教程. 齐伟. 北京:电子工业出版社. 2019.3,第1版
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
关注微信公众号,读文章、听课程,提升技能