专栏首页Crossin的编程教室if __name__ == '__main__': 到底是个啥?

if __name__ == '__main__': 到底是个啥?

if __name__ == '__main__'

很多 Python 相关的教程

都是在这里一笔带过

有些比较好奇的朋友

想知道为啥要这样写

刚好有人问起

今天就来告诉你为啥

当你在写 .py 的时候

一般是以两种方式存在的

1、作为脚本直接运行

2、作为模块给别人导入

你的代码在被执行的时候

Python 解释器会先去

读取你的 Python 代码

然后定义一些全局的内置变量

而我们常常写的这个 __name__

就是其中的变量之一

如果判断出

__name__ 的值是 __main__

就说明这里是程序入口

而非被别的 py 文件 import

这里的运行结果是

程序从上到下按顺序运行

先执行的是打印 name

这和 java 有点不同

没有所谓的主函数

public static void main(String[] args){…}

那么这个 __name__ 是来干嘛的

if __name__ == '__main__' 去掉

不也能照样运行

我们再定义一个方法

专门用来打印变量 __name__ 的值

直接运行

可以看到 __name__ 的值就是 '__main__'

接着换种方式:

我们把这个文件命名为 A.py

作为模块给 B.py 导入

直接 import A

然后运行

运行结果

可以看到

A模块的调用都被执行了

但有一点很不同的是

这里的 name 值是 A

而不再是 __main__

到这里,我们就发现了

当 .py 直接运行的时候

__name__的值是__main__

而当 .py 被当作模块导入的时候

__name__的值是模块的名称

我们接着修改一下 A.py

本来是这样的

现在改成这样

再运行 B.py

这次就不会运行到 A 的调用了

所以你的 .py 可以

作为自己的脚本运行

在 __main__ 中做一些测试

或者本身程序的运行

当然你也可以

使用你的 .py 作为模块给别人使用

给别人提供一些便利

为了不让别人一导入你的模块

就直接运行整个脚本

那么使用

if __name__ == '__main__'

其中的代码就不会在被 import 时被执行。

本文分享自微信公众号 - Crossin的编程教室(crossincode)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • #PY小贴士# 我的PyCharm为什么执行结果很诡异?

    今天讲的这个小问题,没有用过 PyCharm 的同学会完全不知所云,但用过的人,可能有一半以上概率会遇到这个算不上 bug 但也可能让人迷惑的坑。

    Crossin先生
  • 一文教你读懂 Python 中的异常信息

    原文:https://realpython.com/python-traceback/

    Crossin先生
  • Python老司机给上路新手的3点忠告

    在你学习编程的过程中,是否有过以下经历,或正在面临类似的局面: 网上找了很多资料,不知道从哪里看起 买了本书,过了很久也没有看完第一章 开始还能跟着写几行代码,...

    Crossin先生
  • Springmvc响应Ajax请求(@ResponseBody)

    爱撒谎的男孩
  • 【php设计模式】单例模式

    3、在实例化对象的静态方法中,先判断静态变量是否已经被赋值,如果赋值则返回该静态成员如果没有则重新实例化赋值

    码缘
  • 一日一技:通过变量导入Python模块

    这就要求必需把模块名写到代码里面。那如果需要分不同情况传入模块名怎么办呢?这个时候就要使用 __import__关键字了。

    青南
  • 小白学Flask第六天| abort函数、自定义错误方法、视图函数的返回值

    abort函数是我们又新接触的一个函数,具体有什么作用?简单点说它可以终止视图函数的执行并且还可以返回给前端特定的信息。

    JAVAandPython君
  • SSH框架之Struts2第三篇

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    海仔
  • Django (fields.W340) null has no effect on ManyToManyField.

    这只是一个小小的警告,可以不用处理,如果觉得碍眼,可以把product字段的null=True移除

    小贝壳
  • 特别编辑--windows+python+django实现前端页面上传到指定路径生成个性化二维码

    本文是在windows通过python语言,实现前端页面上传文件到我们本地的指定路径,如在liunux环境进行实现,则参考本公众号上一篇文章在linux首先搭建...

    测试小兵

扫码关注云+社区

领取腾讯云代金券