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__' 的左侧,会出现一个绿色小箭头,所谓默认的开始入口:

  • 相关阅读:
    微信小程序HTTPS
    微信商城-1简介
    va_list
    Event log c++ sample.
    EVENT LOGGING
    Analyze Program Runtime Stack
    unknow table alarmtemp error when drop database (mysql)
    This application has request the Runtime to terminate it in an unusual way.
    How to check if Visual Studio 2005 SP1 is installed
    SetUnhandledExceptionFilter
  • 原文地址:https://www.cnblogs.com/fanyuchen/p/7116999.html
Copyright © 2011-2022 走看看