1 前言

很多Python程序中,我们都会遇到if __name__ == "__main__"的情况,却不知道为何要这样做

很多编程语言中,如C、Java等,都需要程序的入口,一般都是main函数程序会从main函数开始执行。而Python脚本语言,是动态解释执行的,即从脚本第一行开始,执行最后没有统一的入口。

Python源码文件除了直接可以运行以外,还可以作为模块导入,当模块被导入时候,其中的源码会被执行(这部分代码被当作顶层代码这里不做深入讨论可以认为顶层代码没有缩进代码

例子

相同路径创建import_file.py

def call_func():
    print("call_func is called!")
    pass

call_func()

创建run_file.py

import import_file

print("Hello run_file!")

输出

call_func is called!
Hello run_file!

我们导入某些包的时候,并不希望文件的某些顶层代码被执行,有些是需要执行比如import ...,此时就需要使用if __name__ == "__main__"

修改import_file.py文件

def call_func():
    print("call_func is called!")
    pass

if __name__ == "__main__":
	call_func()

此时输出结果为:

Hello run_file!

2 原理

首先我们需要直到__name__变量什么

例子

我们将上面的例子输出改为print(__name__),首先我们执行import_file.py(没有使用if __name__ == "__main__":)程序输出结果为:

def call_func():
    print(__name__)
    pass


# if __name__ == "__main__":
call_func()    

>>>
__main__

我们再执行run_file.py可以看到输出为:

import import_file

print(__name__)

>>>
import_file
__main__

以上证明了我们的论述

3 模块

Python中导入的包均已模块的形式进行导入,那模块是什么?即模块是能够独立运行的代码片段,在逻辑上与其它代码分开;可以理解独立完成某一功能代码段。Python中的模块可以是文件,包,类或者函数,它们都能独立完成一些功能

使用__name__属性显示模块的名称

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__变量作用

反应一个包结构

在这里插入图片描述

其中所有文件的内容均为: print(__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进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注