python中使用if __name__ == '__main__':

引子

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

  那如何解决这个问题:函数

一 导入模块自动执行问题

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__这个属性进行判断。从而解决由于导入其余模块自动执行的问题。测试

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

test1.py # 定义foo函数
def foo():
    print('from foo...')

# 在当前文件中的__name__属性值
print(__name__)  # __main__

foo()  # from foo...

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

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...
'''

 

三、在test1.py中添加if __name__ == '__main__'判断对象

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

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

相关文章
相关标签/搜索