`if __name__ == “__main__“:`是什么意思

本文环境及特点:

ubuntu vue-router vuex


每当Python解释器读取源文件时,它都会做两件事:

  • 它设置了一些特殊变量,例如__name__,然后
  • 它执行文件中找到的所有代码。

一 代码样例

假设代码在一个叫做foo.py的文件中。

print("before import")
import math

print("before functionA")
def functionA():
    print("Function A")

print("before functionB")
def functionB():
    print("Function B {}".format(math.sqrt(100)))

print("before __name__ guard")
if __name__ == '__main__':
    functionA()
    functionB()
print("after __name__ guard")

二 运行代码

当Python解释器读取源文件时,它首先会定义一些特殊的变量。比如__name__虽然它长得很奇怪,前面和后面都有一个下划线_,但是记得变量命名的规则嘛?下划线_是可以出现在变量首字母的。所以,__name__仍然是一个变量,只不过,是解释器自己定义的。

2.1 作为主程序运行

当我们在命令行中使用python foo.py,或者直接在ide(比如pycharm)图形界面里点运行foo.py,那么这时候,foo.py就是作为主程序运行的。

此时:
Python解释器会直接给_name_变量赋值为"_main_"

2.2 作为导入的模块运行

如果有另一个程序,叫main.py,它里面的代码是这样的。

import foo

那么如果我们在命令行中使用python main.py,则main.py作为主程序运行,而foo.py就是导入的模块。

此时:
Python解释器会令__name__ = "foo"

2.3 执行foo.py文件中的代码

如果使用主程序运行!python foo.py
输出如下:


    before import
    before functionA
    before functionB
    before __name__ guard
    Function A
    Function B 10.0
    after __name__ guard

如果使用主程序运行import foo
输出如下:

before import
before functionA
before functionB
before __name__ guard
after __name__ guard

可以明显看到,当使用主程序运行import foo时,没有执行下面语句的内容,因为此时__name__ = 'foo'

if __name__ == '__main__':
    functionA()
    functionB()

为什么这样工作?

有时我们想编写一个.py文件,该文件既可以被其他程序和模块导入,也可以作为主程序运行。
例子如下:

  • 这个文件是一个库,可以被其他文件导入。但是我们希望可以在其中运行一些单元测试或演示。

  • 这个文件仅用作主程序,但具有一些单元测试的功能,一些测试框架(类似unittestdoctest)需要导入这个.py文件来测试。我们不希望,它只是因为被导入为模块,就直接运行整个脚本。

  • 这个模块主要用作主程序,但它也为高级用户提供了程序员友好的API

所以,其实就是有的时候希望他在被导入的时候运行一些代码,有的时候希望他作为主程序的时候运行另一些代码。所以需要进行判断。


参考链接

微信公众号

欢迎大家关注我的个人公众号,现阶段主要总结Robomaster相关的计算机视觉知识:Qt,C++,CMake,OpenCV等等
公众号名称:三丰杂货铺

在这里插入图片描述

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值