04-if __name__ == "main"理解

一、初识

首先,粗略来理解一下这条语句的作用以及含义:

'__name __' 是当前模块名,当模块被直接运行时模块名为 '__main __' 。
这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。

二、究其本质

2.1 程序入口

对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# 等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。同样,Java 和 C# 必须要有一个包含 Main 方法的主类来作为程序入口。

而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

一个 Python 源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。

举一个例子来说明一下,假设我们有一个 test01.py 文件,内容如下:

PI = 3.14

def main():
    print("PI: ", PI)

main()

我们在这个文件里边定义了一些常量,然后又写了一个 main 函数来输出定义的常量,最后运行 main 函数就相当于对定义做一遍人工检查,看看值设置的都对不对:

PI: 3.14

若是此时test02.py是用于计算圆的面积,需要用到test01.py中的PI,代码:

from test01 import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main():
    print("round area: ", calc_round_area(2))

main()

结果为:

PI: 3.14
round area: 12.56

可以看得出来,PI: 3.14这一行输出是test01.py中的main()函数输出的,我们的本意是不需要的,所以此时我们就需要用到我们的 if __name __ == "__main __", 修改test01.py文件的代码,如下:

PI = 3.14

def main():
    print("PI: ", PI)

if __name__ == '__main__':
    main()

再次运行test02.py, 查看结果:

round area: 12.56

这才是我们想要的效果。

if __name__ == '__main__' 就相当于是 Python 模拟的程序入口。

Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __name__ 的值。

2.2 认识__name__

__name__ 是内置变量,用于表示当前模块的名字,同时还能反映一个包的结构。

来举个例子,假设有如下一个包:

test_outer
├── test_inner
│   ├── test.py
│   └── __init__.py
└── __init__.py

在这几个.py的文件中,输入 print(__name__)

在PyCharm的终端Terminal中输入命令 python -c "import test_outer.test_inner.test"

结果为:

test_outer
test_outer.test_inner
test_outer.test_inner.test

由此可见,__name__ 可以清晰的反映一个模块在包中的层次。其实,所谓模块名就是 import 时需要用到的名字,例如:

import os
import time

如果一个模块被直接运行,则其没有包结构,其 name 值为 main。例如在上例中,我们直接运行 test.py 文件(python test_outer/test_inner/test.py),输出结果如下:

__main__

所以,if __name__ == '__main__' ,我们简单的理解就是:

如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。

@墨雨出品 必属精品 如有雷同 纯属巧合
`非学无以广才,非志无以成学!`

你可能感兴趣的:(04-if __name__ == "main"理解)