python魔法方法(一): __name__

__name__

__name__

name是python中一个魔法方法,他是一个隐含的变量,代表当前模块的名字,如果当前模块是主模块,则name的值为__main__,否则为模块的名字

怎么去理解这个魔法方法呢?我们先了解python这个语言,python是一种解释型脚本语言,执行时从文件顶部,也就是说从代码的最起始位置逐行翻译,因此python是没有统一的程序入口的

__name__魔法最常用的一个例子是if __name__ == "__main__",既然python是从主程序的第一行开始执行的,那么在导入其他py文件中的方法的时候,就需要跳转到其他文件中并从第一行运行其代码,产生不必要的输出。要避免这种情况,就可以使用__name__来判断当前模块是否是主模块,如果是主模块,则执行下面的语句,否则不执行

这个语句的意思是,如果当前模块是主模块,则执行下面的语句,否则不执行,下面我们看一个例子

我们假设当前目录如下

1
2
3
4
5
6
7
8
9
10
- main.py
from util import PI
print("我是main文件")
print("当前文件名是: ", __name__)
print("PI的值是: ", PI)

- util.py
PI = 3.1415926
print("我是util文件")
print("当前文件名是: ", __name__)

运行main.py文件,输出如下

1
2
3
4
5
我是util文件
当前文件名是: util
我是main文件
当前文件名是: __main__
PI的值是: 3.14

程序运行过程如下: 当我们运行main.py文件时(此时该就是主文件),从util.py中导入了PI变量,但由于python是逐行执行的,他会将util.py中内容全部执行完,在回到主文件,由于util.py中有print语句,因此会输出其结果,然后再回到主文件,输出主文件中的内容

__name__语句是如何发挥作用的呢?

当我们运行main.py时,该文件就是主文件,__name__就会被赋值为__main__,但由于util.py不是主文件,因此__name__就会被赋值为util

本质上__name__这个魔法函数就是一个变量,当运行主文件时他就是__main__,运行其他包时就是包名

避免不必要的输出

知道上述原理之后,我们来修改上述程序,在运行main.py文件时,我们显然是不需要运行util.py中的print函数的,只需要其中的PI变量即可,因此我们修改上述文件为

1
2
3
4
5
6
7
8
9
10
11
- main.py
from util import PI
print("我是main文件")
print("当前文件名是: ", __name__)
print("PI的值是: ", PI)

- util.py
PI = 3.1415926
if __name__ == "__main__": # add this line
print("我是util文件")
print("当前文件名是: ", __name__)

输出结果为

1
2
3
我是main文件
当前文件名是: __main__
PI的值是: 3.1415926

可以看到结果中没有util.py的print结果了,此外为了保险起见,我们最好讲main.py中的print语句之前也加上if __name__ == "__main__":,这样就可以保证在其他包导入main.py文件时不会执行main.py中的print语句了

Error: API rate limit exceeded for 18.204.137.164. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)