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

 

posted @ 2019-04-11 22:30  tank_jam  阅读(2319)  评论(0编辑  收藏  举报