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__’进行对函数功能的测试了!