Date:2022.1.1

Author:qyan.li

Topic:浅析Python中if __name__ == '__main__'的原理和用法

Reference:https://blog.csdn.net/heqiang525/article/details/89879056

一、用法说明:

​ 提及Python中if __name__ == '__main__'的用法,,就需要提到Python中.py文件被运行的两种方式:

  • py文件作为脚本文件直接运行

  • py文件被import至其他文件中执行

    ​ 而if __name__ == '__main__'的用法即体现在py文件被import至其他文件进行的执行时,通常情况下而言,当文件被当作脚本直接运行时,无论是包含在if __name__ == __main__中,还是在之外的代码均会被运行,但是当py文件被import至其他文件内执行时,就仅会执行if __name__ == __main__之前的内容,而之后的内容不会被执行。

    ​ 参照下述代码说明:

    DivideIntoFiles存在两个文件classPerson.pyTestCode.py

    # classPerson.py
    
    def testFunction():
        print('This is a test function!')
    
    testFunction()
    
    if __name__ == '__main__':
        print('This is a standard function')
    

    直接运行classPerson.py,结果显示:

    This is a test function!
    This is a standard function
    

    此时if __name__ == __main__前后的代码均被执行

    # TestCode.py
    from DivideIntoFiles import classPerson
    

    直接运行TestCode.py,结果显示:

    This is a test function!
    

    此时,仅if __name__ == __main__前的代码被执行,其后的代码未被执行

    由上述代码剖析可以看出:

    if __name__ == __main__的作用体现在.py文件被import至其他文件执行时,此时仅if __name__ == __main__前的代码会被执行,而后的代码会被忽略

二、原理说明:

​ 根据上述分析,已经了解到代码中if __name__ == __main__会对代码运行产生的影响,那为什么会产生此种影响呢?

分析上述代码,既然if __name__ == __main__后的代码未被执行,说明此时if语句的条件不成立,即当代码被import时,__name__并不为__main__,同样,可以借助于代码验证。

代码示例:

​ 可以分别在于classPerson.pyTestCode.py文件中分别添加print(__name__)语句,分别观测输出:

# classPerson.py
def testFunction():
    print('This is a test function!')

testFunction()
print(__name__) # output->__main__

if __name__ == '__main__':
    print('This is a standard function')

对比于TestCode.py中:

from DivideIntoFiles import classPerson

print(__name__) # output->DivideIntoFiles.classPerson

借助于上述代码,可以明显得出,在文件被import时,此时的__name__并非为__main__,因此不满足此时的if判断语句,故会出现上述分析的情况

三、小总结:

照例,小总结一下:

  • .py文件被import时,if __name__ == '__main__'后的程序不会被执行
  • 此种现象产生的原因在于当文件被import时,程序中__name__变量发生改变,不再等于__main__if条件不成立,无法执行
  • 自定义引进文件,可以帮助理解from 'package' import 'module'的真正含义
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐