ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python - __name__ == '__main__' 到底是什么意思

2022-04-19 11:32:21  阅读:132  来源: 互联网

标签:__ name Python py world foo hello


总结

之所以常看见这样的写法,是因为该程序可能有“单独执行”(例如执行一些单元测试)与“被引用”两种情况,鉴于这两种情况中__name__的值是不同的:

  • 当一个模块被直接执行时,其__name__必然等于__main__;
  • 当一个模块被引用时,其__name__必然等于文件名(不含.py)

所以利用判断__name__ == '__main__'的真假就可以将这两种情况区分出来。

 

详细说明

相信许多人初学 Python 时,常会在例子程序中看到如下语句:

if __name__ == '__main__':
foo() # 或其他语句

第 1 行的__name__ == '__main__'到底是什么意思呢?

首先,如果你永远都只执行一个 xxx.py,而不去 import它的话,那你完全不需要了解这是什么。例如你写了一个程序,文件名叫 hello.py

print("====this is hello.py====")
def foo():
print("hello")
print("call foo() which is defined here")
foo()
print("====this is hello.py END ====")

然后你总是直接执行它,就像这样

$ python3 hello.py
====this is hello.py====
call foo() which is defined here
hello
====this is hello.py END ====


这完全没有问题。

但是,当别人想引用你的foo()函数时,就有问题了。

例如别人写了一个文件,名字是 world.py

# world.py
print("====this is world.py====")
from hello import foo

print("call foo() which is defined in other file")
foo()
print("====this is world.py END ====")

运行结果如下:

$ python3 world.py
====this is world.py====
====this is hello.py====
call foo() which is defined here
hello
====this is hello.py END ====
call foo() which is defined in other file
hello
====this is world.py END ====


可以看到,解释器是逐行解释源码的,当执行到源码的第 3 行时,也就是 hello.py 被引用时,hello.py 的每一行都会被解释器读取并执行,执行效果就是结果中的3~6行,然后解释器执行源码的5~7行。

如果你不想要结果中的3~6行,该怎么做呢?

Python 解释器执行代码时,有一些内建、隐含的变量,__name__就是其中之一,其意义是“模块名称”。

如果该模块是被引用,那么__name__的值会是此模块的名称;如果该模块是直接被执行,那么__name__的值是__main__。

或许你还不明白,那我们来做个实验。

# hello.py
print("====this is hello.py====")
print(__name__)
def foo():
print("Ha")
print("call foo() which is defined here")
foo()
print("====this is hello.py END ====")


请注意上面第3行

# world.py
print("====this is world.py====")
print(__name__)
from hello import foo
print("call foo() which is defined in other file")
foo()
print("====this is world.py END ====")

同样,请注意上面第3行

我们看一下运行结果。

对于第一个:

$ python3 hello.py
====this is hello.py====
__main__
call foo() which is defined here
Ha
====this is hello.py END ====


从结果的第3行可以看出,对于直接运行的模块,其模块名是 __main__

对于第二个:

$ python3 world.py
====this is world.py====
__main__ # 因为 world.py 被直接执行,所以这里的值是 __main__
====this is hello.py====
hello # 因为 hello.py 被引用,所以这里的值是 hello
call foo() which is defined here
Ha
====this is hello.py END ====
call foo() which is defined in other file
Ha
====this is world.py END ====


注意到第5行了吗?这里的“hello”正是 hello.py 被引用时的模块名称。

由此可见,__name__的值在模块被直接执行时与被引用时是不同的。

回到上面的问题:当一个模块被引用时,如何不执行该模块的语句?答案就是靠判断__name__是否等于 __main__。当一个模块被直接执行时,其__name__必然等于__main__;当一个模块被引用时,其__name__必然等于文件名(不含.py);

参考文献

版权声明:本文为CSDN博主「车子 chezi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/longintchar/article/details/87120496

 

标签:__,name,Python,py,world,foo,hello
来源: https://www.cnblogs.com/frankcui/p/16164369.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有