如何理解python中的if name == “main”:
前言
使用别人的工具的时候,不知道哪里出了错,于是仔细看代码,在可能出现的模块之前加上了print(“test”),但是就是不能显示输出信息。于是溯源,最后追溯到最前面的
if __name__ == "__main__":
main()
然后发现自己不懂,由于对python的模块(module)不是很清楚,决定好好把这个知识点理清。
问题
- __name__是什么
- __main__又是什么,为什么要加双引号
__name__和__main__都是python的内置函数模块(模块是指以.py结尾写好的函数的汇总)。
- 这段代码放在程序最后作用又是什么
两个作用:一是入口点作用;二是防止在import的时候执行可执行的程序。
知识点
- 模块(module)
一个模块被另一个程序第一次引入时,这个模块下可以被解释器直接执行的函数将运行。
如
# const.py
PI = 3.14
def test():
print("PI:", PI)
test()
print("haha")
# 运行结果:PI: 3.14
# 运行结果:haha
如果在命令行执行
py -c "import const"
其输出将和运行const.py
的结果是相同的。
类似地,当在const.py
这个模块被另一个程序(如area[.]py)第一次引入时,test()和print(“haha”)将会运行。
from const import PI
def calc_round_area(radius):
return PI * (radius ** 2)
def main():
print("round area: ", calc_round_area(2))
main()
#输出结果
#PI: 3.14
#haha
#round area: 12.56
理清思路
现在我们在运行程序area.py
,调用了const.py
里的PI常量。
但是现在我们不想让const.py
中的函数test()和print()执行。
谁来拯救你?
这个时候我们的标题中的主角要登场了,他/她就是
if __name__ == "__main__":
通过在const.py
中加入这句话,我们可以防止const.py
里的test()
在被导入的时候执行。
完整的代码如下
# const.py
PI = 3.14
def test():
print("PI:", PI)
if __name__ == "__main__":
test()
print("haha")
# 运行结果:
# PI: 3.14
# haha
# area.py
from const import PI
def calc_round_area(radius):
return PI * (radius ** 2)
def main1():
print("round area: ", calc_round_area(2))
main1()
结语
看到网上很多都是在后面加一个main()函数,这里的名称只是约定俗成,我在代码中特意改成test
, main1
,都可以运行。
至于为什么是main,这是因为从其他编程语言沿袭过来的程序入口点概念。C,C++, Java都以main
函数为主函数入口点,而python没有硬性规定这个概念,所以在用这样的方式来实现入口点的作用。
也就是说,写的函数可以全部是用def
定义,然后再定义一个main
,指向其中一个def
定义的函数。
总的来说,关键点是import的时候会执行模块中的函数,掌握了这个知识点对模块也就理解更深了。
参考
菜鸟教程——Python3模块
Python 中的 if name == ‘main’ 该如何理解
W3CSchool_Python Modules
补充
最后凭借这些知识点,终于找到为什么print无输出,因为加了
sys.stdout = sys.stdout.reconfigure(encoding='utf-8')
似乎终端不兼容格式,所以不输出显示。