if __name__ == '__main__' 这段代码该如何理解?

作者:张steel

链接:https://www.zhihu.com/question/58646802/answer/158556775

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

python中目录可以理解成一个包(package),一个源文件可以备理解成一个模块(module)。当你写了一个python文件时,有两种方式可以使用它,一种是直接调用(python example.py),一种是将它import到另一个模块中使用(比如在模块another_example.py中使用语句——import example)。python 解释器在执行一个module里面的代码之前,会定义一些特殊的变量。就比如题主所问中的__name__变量。如果是解释器将这个module作为主程序去执行的时候(上面的第一种方式),它会将__name__设置成值: __main__。如果这个module是被其他module import的话(上面第二种方式),那么它的__name__会被设置成它的模块名。下面代码展示了__name__的值会随着调用该模块的方式不同而不同。[root@108 testproject]# cat example.py

print "The value of __name__ is: " , __name__

[root@108 testproject]# cat another_exampel.py

import example

[root@108 testproject]# python example.py

The value of __name__ is:  __main__

[root@108 testproject]# python another_exampel.py

The value of __name__ is:  example

知道了__name__不同值的意义,我们再来看“if __name__ == '__main__'”就很好理解了。当你直接调用我时,if 条件为True,if 里面的代码段才会执行。如果你是import 我,那么if 条件为False, if 里面的代码段就不执行啦。有了if __name__ == '__main__', 你可以在当前模块内验证模块的功能而不会影响import该模块的其他模块。例如,python官方库中wsgiref 实现了一个符合wsgi规范的web服务器,在它源码的最后,给出了一个如何用wsgiref起一个web服务的简单步骤。if __name__ == '__main__':

httpd = make_server('', 8001, demo_app)

sa = httpd.socket.getsockname()

print "Serving HTTP on", sa[0], "port", sa[1], "..."

import webbrowser

webbrowser.open('http://localhost:8000/xyz?abc')

httpd.handle_request()  # serve one request, then exit

你可能感兴趣的:(if __name__ == '__main__' 这段代码该如何理解?)