美文网首页
if __name__ == '__main__'

if __name__ == '__main__'

作者: 默写年华Antifragile | 来源:发表于2019-02-25 17:38 被阅读0次

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

    例子如下:

    • test.py
    print("test.py: ", __name__)
    

    输出:

    test.py: __main__

    • test1.py
    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 用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。
    比如:

    • test.py
    Pi = 3.14
    def main():
        print("Pi: ", Pi)
    
    main()     
    

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

    Pi: 3.14

    • test1.py
    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,因此可以这么改:

    • test.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 中判断条件不符合

    相关文章

      网友评论

          本文标题:if __name__ == '__main__'

          本文链接:https://www.haomeiwen.com/subject/pzmgyqtx.html