主要解释下python 中
if __name__ == '__main__'
的意思
先来看两个简单的示例。
demoa.py 文件
#定义一个全局变量
PI = 3.14
def print_pi():
print 'PI:{}'.format(PI)
def say_hello():
print 'hello world'
say_hello()
demob.py 文件
from demoa import PI
def calc_round_area(radius):
return PI * (radius ** 2)
print calc_round_area(2)
执行demob.py 文件,结果如下:
hello world
12.56
由执行结果可以看到,执行demob.py 文件时,demoa.py 文件中的 say_hello() 函数先执行了。
现在,修改demoa.py 文件为如下内容:
#定义一个全局变量
PI = 3.14
def print_pi():
print 'PI:{}'.format(PI)
def say_hello():
print 'hello world'
if __name__ == '__main__':
say_hello()
再次执行demob.py 文件,结果如下:
12.56
由上述执行结果可以看到,demoa.py 文件中的say_hello() 函数未执行。从上述的例子中,可以看出 if __name__ == '__main__'
的作用了。
一个模块A中定义了一个函数a,并在模块A中直接调用了函数a(没有在if __name__ == '__main__' 下调用).
在模块B 中导入模块A, 在执行模块B 的内容时,模块A 中的函数a 会先被调用。
(也就是说,在模块B 中导入模块A 时,会把A 中的代码执行一遍。)
简单说明
简单理解__name__ == '__main__'
:
__name__
是内置变量,可用于表示当前模块的名字。
demoa.py,在demob.py中,它是demoa(__name__ == 'demoa')
;在demob自己眼中,它是它自己(__name__ == '__main__')
。
demob.py 文件中
import demoa
def calc_round_area(radius):
return demoa.PI * (radius ** 2)
print calc_round_area(2)
print __name__ # __main__
print demoa.__name__ # demoa
if __name__ == '__main__'
的意思是:当.py文件被直接运行时,if __name__ == '__main__'
之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'
之下的代码块不被运行。