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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,463评论 19 139
  • 新手求助,windows版本的python没有termios这个模块是没有。如果想在windows下跑,得装cyg...
    夏天夏星阅读 7,641评论 0 1
  • stackoverflow上有一个很好的解释。 When the Python interpreter reads...
    你说你要一场阅读 3,680评论 0 1
  • 春雨贵如油 农谚 是说经历了严冬 万物复苏亟需雨水浇灌 此时的南方小镇 正是春雨淅沥 午后时光 格外静谧 早上冲泡...
    花开喵富贵阅读 1,696评论 0 0
  • 带伞的时候没下雨 没伞的那天下大雨 生活的尴尬没规律 青青的草地花不绯 红红的梅枝无叶陪 自然的美好不完美 感情太...
    浅得塾心灵文画阅读 929评论 2 5