一文弄懂Python中的 if __name__ == __main__(简书 python)

网友投稿 275 2022-09-03


一文弄懂Python中的 if __name__ == __main__(简书 python)

1. 引言

在Python相关代码中,我们经常会遇到如下代码段:

# stuffif __name__ == "__main__": # do stuff

本文将尽可能使用简单的样例来解释这里发生了什么,以及需要使用​​if __name__=="__main__"​​的情形。请注意,上述代码中​​name​​和​​main​​前后有2个下划线字符。

闲话少说,我们直接开始吧!

2. 特殊变量

当我们正常运行我们的​​Python​​脚本时,该脚本中的变量​​__name__​​的值一般为​​__main__​​。我们来看个示例:

# first.pyprint(__name__)

我们在终端中运行上述脚本,代码如下:

python first.py

输出如下:

__main__

观察上述输出,当我们运行脚本​​first.py​​的时候,变量​​__name__​​的值被设置为​​__main__​​。

3. 复杂的例子

上述示例相对简单,也相对容易理解。接着我们来举个具有多个文件的例子,这里假设我们有三个脚本,分别为​​a.py​​,​​b.py​​以及​​c.py​​。

其中,​​a.py​​的内容如下:

# a.pyprint("__name__ in a.py:", __name__)from b import *from c import *

此时,​​b.py​​的内容如下:

# b.pyprint("__name__ in b.py:", __name__)

​​c.py​​的内容如下:

# c.pyprint("__name__ in c.py:", __name__)

如果我们运行命令​​python a.py​​得到结果如下:

__name__ in a.py: __main____name__ in b.py: b__name__ in c.py: c

注意在脚本​​a.py​​中我们看到​​__name__​​的值为​​__main__​​,此时在脚本​​b.py​​中​​__name__​​的值为​​b​​, 同时 ​​c.py​​中​​__name__​​的值为​​c​​。这是因为我们运行的脚本为​​a.py​​,那么该脚本即​​a.py​​中变量​​__name__​​的值将会被设置为字符串​​__main__​​.

此外,脚本​​b.py​​和​​c.py​​中的变量·​​__name__​​分别保持为​​b​​和​​c​​,这是因为脚本​​b.py​​和​​c.py​​不是直接运行的脚本。而是我们运行的脚本​​a.py​​调用了​​b.py​​和​​c.py​​中的​​print​​函数。

如果我们单独运行​​python b.py​​得到结果如下:

__name__ in b.py: __main__

相应的我们运行​​python c.py​​,得到结果如下:

__name__ in c.py: __main__

观察上述两个输出,当我们直接运行脚本​​b.py​​或​​c.py​​,相应的脚本里的变量​​__name__​​都将被设置为​​__main__​​。

4. 使用场景

作为Python开发者,我们通常会在一个项目工程中创建多个​​Python​​文件而不是将所有代码都写在一个​​Python​​文件中。因此我们通常会有一个主的​​Python​​文件用来作为项目工程的入口,同时其他文件包含一些辅助性的函数实现。

我们来看个示例,这里假设我们有两个​​Python​​文件,如下:

# main.pyfrom helper import *print(greet("bob"))

辅助函数实现 ​​helper.py​​内容如下:

# helper.pydef greet(name): return "hello " + nameprint(greet("testname"))

如果此时我们运行命令 ​​python main.py​​,得到结果如下:

hello bobhello testname

主要上述的​​import​​语句将从​​helper.py​​中引入所有的语句,所以​​helper.py​​中的测试语句​​print(greet("testname"))​​也将被执行。虽然我们可以通过添加注释或者屏蔽注释来达到运行​​main.py​​或​​helper.py​​来控制该测试语句的输出,但是这种情形就是语句

​​if __name__=="__main__"​​ 大显身手的情形。

5. 解决方案

我们针对上述情形,进行代码整改,如下:

# main.pyfrom helper import *print(greet("bob"))

我们修改文件 ​​helper.py​​内容如下:

def greet(name): return "hello " + nameif __name__ == "__main__": print(greet("testname"))

此时,我们执行命令​​python main.py​​,得到结果如下:

hello bob

注意,此时`helper.py​​中的变量 ​​__name__​​的值为​​helper​​, 所以​​helper.py​​中的​​if​​语句不成立,进而将不会执行我们的测试语句​​print(greet("testname"))`.

此时,如果我们单独运行命令​​python helper.py​​ ,得到结果如下:

hello testname

单独运行​​helper.py​​时,此时改脚本中的变量​​__name__​​将被设置为​​__main__​​,所以此时的测试语句将会被执行,输出相应的测试结果。

6. 总结

本文重点介绍了Python中常见的​​if __name__=="__main__"​​ ,重点分析了其背后的原理和应用的场景。

您学废了嘛?


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:根据baselines库修改的运行输入参数的解析代码
下一篇:spring boot项目没有mainClass如何实现打包运行
相关文章

 发表评论

暂时没有评论,来抢沙发吧~