zoukankan      html  css  js  c++  java
  • 理解if __name__ == '__main__':

    一开始没怎么注意这个语句,这两天在模拟知乎登陆时准备刨根问底了,先看两行代码片段

    第一个例子:这是在login.py文件的一部分,其他我们忽略,只关注print()函数的内容

     1 import time
     2 import json
     3 
     4 if __name__ == '__main__':
     5 
     6     print(__name__)
     7 
     8     cookie = http.cookiejar.LWPCookieJar('cookie')
     9 
    10     try:
    11         cookie.load(ignore_discard=True)

    第二个例子:在另一个文件wechart.py中,我们引入login文件,通用我们忽略别的代码,只关注print()函数

    1 #import itchat
    2 '''from login import printName
    3 printName()'''
    4 
    5 import login
    6 print(login.__name__)

    例子看完了,我们来看打印的结果吧,同样都是打印login文件中的内置变量__name__,两次打印会有什么不同呢?

    第一个例子打印结果:

    第二个例子打印结果:

    看到区别了吧,首先这个内置变量__name__时标识所在文件或模块的名字,在自身文件中执行显示为'__main__',在其他文件中调用显示为文件名全名。

    看完了__name__的命名规则,我们就容易理解if语句:

    if __name__ == '__main__':   这句话实际上是在判断当前语句在什么环境下调用的,如果是在本文件中调用,则条件为真,如果实在其他模块中调用,则条件为假

    那么为什么大家喜欢在代码的开头加上一句if判断呢:场景1:如果一个文件被打包成模块,在这个文件中存在一个语句块用if __name__ == '__main__'包裹着,其他代码没有用if语句包裹。然后这个模块作为第三方模块被别人引用,如下:我们把上一段代码的注释去掉。

    1 from login import printName
    2 printName()
    3 
    4 import login
    5 print(login.__name__)

    我们再来看执行结果:  我们发现,仅仅时导入模块这个动作,login文件中的代码也被执行了(当然时if语句之外的代码)

     而我们导入模块时是不希望模块中的代码被执行的,只希望他在调用时执行,而非导入时就执行。所以,在打包模块时,我们加上一句if __name__ == '__main__',这样所有代码都不会被执行。

    后来,我们发现在所有的代码开始之前,都有if __name__ == '__main__',再后来,这就变成了程序的入口(约定俗成)。

    在pycharm等集成开发环境中,我们也会看到,在if __name__ == '__main__' 的左侧,会出现一个绿色小箭头,所谓默认的开始入口:

  • 相关阅读:
    网站优化记录
    在pc游览器端模拟移动端幻灯片
    jquery消息提示框
    开发jquery tab 插件
    js检测是否安装了flash插件
    javaweb项目下解决360兼容模式不能下载文件问题
    简单的excel上传解析和错误反馈信息下载
    sqlserver带游标存储过程及调用函数
    oracle带游标存储过程编写
    简单的spring+dubbo提供和消费方
  • 原文地址:https://www.cnblogs.com/fanyuchen/p/7116999.html
Copyright © 2011-2022 走看看