zoukankan      html  css  js  c++  java
  • python中使用if __name__ == '__main__':

    引子

      在python中,假设在一个test1.py的模块中定义了一个foo函数,然后调用函数foo进行测试的时候会产生一个内存空间。当你把这个模块导入到test2.py模块中,接下来如果在test2.py模块中执行某一段代码的时,就会自动执行test1.py模块中的foo函数这样会导致什么问题呢?会导致你原本只想测试当前的代码,又自动执行了另一个模块中的函数。

      那如何解决这个问题:

    一 导入模块自动执行问题

    test1.py
    
    # 定义foo函数
    def foo():
        print('from foo...')
    
    foo()  # from foo...
    test2.py
    
    from test_1 import test1
    
    # 在test2.py模块中打印test1.py模块中的__name__属性发生了变化
    print(test1.__name__)  # test_1.test1
    
    def bar():
        print('from bar...')
    
    bar()  
    
    # 此时会在当前文件中执行bar函数会自动执行test1模块中的foo函数
    '''
    from foo...
    from bar...
    '''

    二 使用if __name__ == '__main__' 解决自动执行问题

       因为在python中一切皆对象,其实模块也是一个对象,那么每一个模块中都包含着一个__name__属性,而这个属性会根据模块所在的位置而发生变化。我们可以通过对__name__这个属性进行判断。从而解决因为导入其他模块自动执行的问题。

    1、test1.py模块中打印__name__属性。

    test1.py 
    
    # 定义foo函数
    def foo():
        print('from foo...')
    
    # 在当前文件中的__name__属性值
    print(__name__)  # __main__
    
    foo()  # from foo...

    2、在test2.py模块中执行bar函数

    test2.py
    
    from test_1 import test1
    
    # 在test2.py模块中打印test1.py模块中的__name__属性发生了变化
    print(test1.__name__)  # test_1.test1
    
    def bar():
        print('from bar...')
    
    bar()  
    
    # 此时会在当前文件中执行bar函数会自动执行test1模块中的foo函数
    '''
    from foo...
    from bar...
    '''

    3、在test1.py中添加if __name__ == '__main__'判断

      由上述可见,test1.py模块中的__name__会根据执行文件的位置发生变化,由此我们可以通过对__name__属性进行判断调用者是否在当前模块调用函数进行测试。如果不是当前文件执行,就不会执行调用的函数。

    test1.py 
    
    # 定义foo函数
    def foo():
        print('from foo...')
    
    # 在当前文件中的__name__属性值
    print(__name__)  # __main__
    
    if __name__ == '__main__':  # __name__: test_1.test1
        foo()
    test2.py
    
    from test_1 import test1
    
    print(test1.__name__)  # test_1.test1
    
    def bar():
        print('from bar...')
        
    bar()  # from bar...

      这就是为何在python中要使用if __name__ == ‘__main__’进行对函数功能的测试了!

  • 相关阅读:
    error: readline/readline.h: No such file or directory
    ImportError: No module named setuptools
    ImportError: No module named argparse
    为python安装pip
    yum源安装配置
    n元一维向量向左循环移位i的几种算法
    以空间换时间编程策略的细节问题以及解决方案
    Hash(散列函数)简单应用引出解决散列冲突的四种方法
    随机取样
    排序问题
  • 原文地址:https://www.cnblogs.com/kermitjam/p/10693110.html
Copyright © 2011-2022 走看看