理解if __name__ == '__main__':
一开始没怎么注意这个语句,这两天在模拟知乎登陆时准备刨根问底了,先看两行代码片段
第一个例子:这是在login.py文件的一部分,其他我们忽略,只关注print()函数的内容
import time
import json if __name__ == '__main__': print(__name__) cookie = http.cookiejar.LWPCookieJar('cookie') try:
cookie.load(ignore_discard=True)
第二个例子:在另一个文件wechart.py中,我们引入login文件,通用我们忽略别的代码,只关注print()函数
#import itchat
'''from login import printName
printName()''' import login
print(login.__name__)
例子看完了,我们来看打印的结果吧,同样都是打印login文件中的内置变量__name__,两次打印会有什么不同呢?
第一个例子打印结果:

第二个例子打印结果:

看到区别了吧,首先这个内置变量__name__时标识所在文件或模块的名字,在自身文件中执行显示为'__main__',在其他文件中调用显示为文件名全名。
看完了__name__的命名规则,我们就容易理解if语句:
if __name__ == '__main__': 这句话实际上是在判断当前语句在什么环境下调用的,如果是在本文件中调用,则条件为真,如果实在其他模块中调用,则条件为假
那么为什么大家喜欢在代码的开头加上一句if判断呢:场景1:如果一个文件被打包成模块,在这个文件中存在一个语句块用if __name__ == '__main__'包裹着,其他代码没有用if语句包裹。然后这个模块作为第三方模块被别人引用,如下:我们把上一段代码的注释去掉。
from login import printName
printName() import login
print(login.__name__)
我们再来看执行结果: 我们发现,仅仅时导入模块这个动作,login文件中的代码也被执行了(当然时if语句之外的代码)

而我们导入模块时是不希望模块中的代码被执行的,只希望他在调用时执行,而非导入时就执行。所以,在打包模块时,我们加上一句if __name__ == '__main__',这样所有代码都不会被执行。
后来,我们发现在所有的代码开始之前,都有if __name__ == '__main__',再后来,这就变成了程序的入口(约定俗成)。
在pycharm等集成开发环境中,我们也会看到,在if __name__ == '__main__' 的左侧,会出现一个绿色小箭头,所谓默认的开始入口:

理解if __name__ == '__main__':的更多相关文章
- 理解 if __name__ == '__main__'
简单地理解Python中的if __name__ == '__main__' if __name__ == '__main__'的意思是: 当.py文件被直接运行时,if __name__ == '_ ...
- 一个故事带你理解if __name__ == '__main__'
如果你刚刚接触python,相信会在看别人的程序的时候会遇到if __name__ == '__main__'酱紫的语法,如果当时没看懂现在也一知半解的话,看下去,本文可以帮你解决这个问题. 大家都知 ...
- (转)Python中如何理解if __name__ == '__main__'
摘要 通俗的理解 __name__ == '__main__' :假如你叫李凯.py,在朋友眼中,你是李凯( __name__ == '李凯' ):在你自己眼中,你是你自己( __name__ == ...
- python中如何理解if __name__ == '__main__'
__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ .这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行.我们通过一个简单的例子来理解 ...
- 从python run 和python unittest两种eclipse运行方式深入理解if __name__ == "__main__"
在写一个简单的python测试程序的时候,发现eclipse中Run as "Python run 和 Python unittest”结果不一样?为什么会不一样? 先贴一下代码段: # - ...
- 如何理解 if __name__ == "__main__"
小明.py 朋友眼中你是小明(__name__ == '小明'), 你自己眼中你是你自己(__name__ == '__main__'), 你编程很好, 朋友调你去帮他写程序(import 小明, 这 ...
- 你真的理解 if __name__ == '__main__' 的作用么?
https://blog.csdn.net/Amberdreams/article/details/88382993
- 【转】Python 中的 if __name__ == '__main__' 该如何理解
转自:http://blog.konghy.cn/2017/04/24/python-entry-program/ 程序入口 对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面 ...
- if __name__ == '__main__' 该如何理解
Python 中的 if __name__ == '__main__' 该如何理解 程序入口 对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# ...
随机推荐
- EUI组件之ProgressBar
一.ProgressBar常规使用 拖动一个progressbar到exml 代码中使用 /** * 主页场景 * @author chenkai 2018/5/26 */ class HomeSce ...
- 【BZOJ1568】[JSOI2008]Blue Mary开公司 线段树
[BZOJ1568][JSOI2008]Blue Mary开公司 Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“P ...
- Think PHP递归获取所有的子分类的ID (删除当前及子分类)
递归获取所有的子分类的ID: //递归获取所有的子分类的ID function get_all_child($array,$id){ $arr = array(); foreach($array as ...
- 【转载】网络安全---Strurts2漏洞介绍
Apache Struts2 作为世界上最流行的 Java Web 服务器框架之一,3 月 7 日带来了本年度第一个高危漏洞——CVE编号 CVE-2017-5638 .其原因是由于 Apache S ...
- pta 习题集5-6 堆栈操作合法性
假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列.请编写程序,输入S ...
- Python开发【模块】:Requests(一)
Requests模块 1.模块说明 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urlli ...
- Linux下的Daemon简介(转)
add by zhj: 接触这个概念也有段时间了,但一直没搞明白,今天总算明白了. 原文:http://wenku.baidu.com/link?url=FEJeQ0J45YaFXansxT2GVVB ...
- MySQL 通用查询日志和慢查询日志分析
MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句.2)慢查询 ...
- Mysql覆盖索引与延迟关联
延迟关联:通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据. 为什innodb的索引叶子节点存的是主键,而不是像myisam一样存数据的物理地址指针? 如果存的是物理地址指针不 ...
- Mirror--自增键在镜像中的影响
测试环境: OS: Windows Server 2008 R2 Enterprise SQL: SQL Server 2012 Enterprise 测试场景: 有SERVER A上数据库 DB10 ...