1 前言
在很多Python
程序中,我们都会遇到if __name__ == "__main__"
的情况,却不知道为何要这样做
在很多编程语言中,如C、Java
等,都需要程序的入口,一般都是main
函数,程序会从main
函数开始执行。而Python
是脚本语言,是动态解释执行的,即从脚本的第一行开始,执行到最后,没有统一的入口。
Python
的源码文件除了直接可以被运行以外,还可以作为模块被导入,当模块被导入的时候,其中的源码会被执行(这部分代码被当作顶层代码,这里不做深入讨论,可以认为顶层代码即没有缩进的代码)
例子:
def call_func():
print("call_func is called!")
pass
call_func()
import import_file
print("Hello run_file!")
输出:
call_func is called!
Hello run_file!
当我们导入某些包的时候,并不希望文件的某些顶层代码被执行,有些是需要被执行的比如import ...
,此时就需要使用if __name__ == "__main__"
:
def call_func():
print("call_func is called!")
pass
if __name__ == "__main__":
call_func()
Hello run_file!
2 原理
-
当
py
文件被当作模块导入的时候,此时__name__
为模块的名字。所谓模块的名字,导入的是一个文件,则模块名为文件名(无后缀),比如pandas
,那么__name__
的值为"pandas"
;如果导入的是一个类名或者变量名,则模块名为类名或者函数明,比如:from matplotlib import pyplot as plt
,__name__
的值为pyplot
,尽管使用as
例子:
我们将上面的例子的输出改为print(__name__)
,首先我们执行import_file.py(没有使用if __name__ == "__main__":)
,程序的输出结果为:
def call_func():
print(__name__)
pass
# if __name__ == "__main__":
call_func()
>>>
__main__
import import_file
print(__name__)
>>>
import_file
__main__
以上证明了我们的论述
3 模块
Python中导入的包均已模块的形式进行导入,那模块是什么?即模块是能够独立运行的代码片段,在逻辑上与其它代码分开;可以理解为独立完成某一功能的代码段。Python中的模块可以是文件,包,类或者函数,它们都能独立完成一些功能
import pandas as pd
print(pd.__name__)
输出的结果为: pandas 虽然我们使用了as,但是导入的模块仍按照pandas文件名进行导入
如果我们导入模块中的模块,那么将导入子模块而不是整个模块
from matplotlib import pyplot as plt
print(plt.__name__)
输出的结果为:matplotlib.pyplot,而输出print(matplotlib.__name__)
则会报错: NameError: name 'matplotlib' is not defined
说明模块没有被导入
4 __name__
变量的作用
执行
import my_module.b.c
输出:
my_module
my_module.b
my_module.b.c
结果:
可见导入时,都执行了__init__.py
,并产生了缓存,展示了包所在的层次结构
参考
如何简单地理解Python中的 if name == ‘main’: https://blog.csdn.net/yjk13703623757/article/details/77918633
Python 中的 if name == ‘main’ 该如何理解:https://blog.konghy.cn/2017/04/24/python-entry-program/
原文地址:https://blog.csdn.net/qq_44776065/article/details/128551278
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_42946.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!