if __name__ == '__main__'

2019-02-25  本文已影响0人  默写年华Antifragile

每个 python 模块(python 文件,如下的 test.py)都包含了内置的变量 __name__, 用来表示当前模块的名字,如果是直接运行该模块,则当前模块的__name____main__,如果该模块是被导入的 (import),则__name__为当前的文件名(没有.py)

例子如下:

print("test.py: ", __name__)

输出:

test.py: __main__

import test
print("test1.py: ", __name__)

输出:

test.py: test
test1.py: __main__

-----------------------------------------------------------------------------------------------------

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

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

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

Pi = 3.14
def main():
    print("Pi: ", Pi)

main()     

运行 test.py: python test.py
输出:

Pi: 3.14

from test import Pi                                                             

def area(r):
    return Pi*(r**2)

def main():
    print("Area: ", area(2))

main()

运行test1.py: test1.py

Pi: 3.14
Area: 12.56

可以看到,我们在 import test import Pi的时候,把 test.py 也执行了一遍,这样就输出了 Pi,而我们这里不想输出 Pi,运行 test1.py,因此可以这么改:

Pi = 3.14
def main():
    print("Pi: ", Pi)

print(__name__)
if __name__ == '__main__':                                                      
    main()

输出:
main
Pi: 3.14

-test1.py

from test import Pi                                                             

def area(r):
    return Pi*(r**2)

def main():
    print("Area: ", area(2))

print(__name__)
if __name__ == '__main__':
    main()

输出:
test
main
Area: 12.56

这样就只输出test1.py里面的内容,因为在 test1.py import test.py后,运行python test1.py时,__name__在test1.py中为__main__,在test.py中__name__为 test.py 的模块名 (test),因此 test.py 中判断条件不符合

上一篇下一篇

猜你喜欢

热点阅读