点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达

原文链接:

https://medium.freecodecamp.org/whats-in-a-python-s-name-506262fe61e8

大家应该已经在很多 Python 脚本里见到过 __name__ 变量了吧?它经常是以类似这样的方式出现在我们的程序里:

if __name__ == '__main__':main()

今天,我就带大家详细扒一扒这个内置变量的用法,示范一下在你写的 Python 模组里要怎么用到它。

这个 __name__ 拿来做什么的?

作为 Python 的内置变量,__name__变量(前后各有两个下划线)还是挺特殊的。它是每个 Python 模块必备的属性,但它的值取决于你是如何执行这段代码的。

在许多情况下,你的代码不可能全部都放在同一个文件里,或者你在这个文件里写的函数,在其他地方也可以用到。为了更高效地重用这些代码,你需要在 Python 程序中导入来自其他文件的代码。

所以,在__name__ 变量的帮助下,你可以判断出这时代码是被直接运行,还是被导入到其他程序中去了。

这个 __name__ 变量可能取什么值?

当你直接执行一段脚本的时候,这段脚本的 __name__变量等于 '__main__',当这段脚本被导入其他程序的时候,__name__ 变量等于脚本本身的名字。

下面,让我举两个栗子来说明一下:

情况 1 - 直接运行脚本

假设我们有一个nameScript.py,代码如下:

def myFunction():print('变量 __name__ 的值是 ' + __name__)
def main():myFunction()
if __name__ == '__main__':main()

当你直接执行 nameScript.py 时,流程是这样处理的:

在所有其他代码执行之前,__name__变量就被设置为 '__main__' 了。在此之后,通过执行 def 语句,函数 main() 和 myFunction() 的本体被载入。

接着,因为这个 if 语句后面的表达式为真 true,函数 main() 就被调用了。而 main() 函数又调用了myFunction(),打印出变量的值'__main__'

情况 2 - 从其他脚本里导入

如果你需要在其他脚本里重用这个 myFunction() 函数,比如在 importingScript.py 里,我们可以将 nameScript.py 作为一个模组导入。

假设 importingScript.py 的内容如下:

import nameScript as ns
ns.myFunction()

这时,我们就有了两个不同的作用域:一个是 importingScript 的,一个是 nameScript 的。让我画个示意图,你就能看出这和之前的区别了:

 importingScript.py 里,__name__ 变量就被设置为 '__main__'。当导入 nameScript 的时候,Python 就在本地和环境变量 PATH 指向的路径中寻找对应名称的 .py 文件,找到之后,将会运行导入的文件中的代码。

但这一次,在导入的时候,它自身的 __name__ 变量就被设置为了 'nameScript',接下来还是一样,函数 main()  myFunction() 的本体被载入。然而,这一次 if 语句后面的表达式结果为假 false,所以 main() 函数没有被调用。

导入完毕之后,回到 importingScript.py 中。现在 nameScript 模块中的函数定义已经被导入到当前的作用域中,于是我们通过 ns.myFunction() 的方式调用模块中的函数,这个函数返回的是模块内的变量的值 'nameScript'

如果你试着在 importingScript 中打印 __name__ 变量的值,那当你直接执行 importingScript 的时候,它也会输出 '__main__'。原因在于,这个变量是在 importingScript 的作用域中的。

总结

今天和大家一起讨论了 __name__ 变量在模组中的特性,分析了不同的调用方式对它的值有什么影响。利用这个特性,你既可以在程序中导入模组来使用,也可以直接把模组本身作为程序来运行。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

Python 的 __name__ 变量,到底是个什么东西?相关推荐

  1. python语言的变量特点随时_完美契合人类习惯的Python变量和基本数据类型

    文|宝哥版权|宝哥 有趣又有深度的灵魂,相遇不易,点击'关注',让我用最走心的文字,观察世间百态.解析技术奥秘! 做科学计算和数据分析,变量是始终绕不开的话题.学习程序设计语言,理解了变量相当于掌握了 ...

  2. 微课系列(5):Python程序中__name__变量的用法

    技术要点: 1)Python程序也可以当作模块来使用. 2)当Python程序直接运行时,__name__变量的值是字符串'__main__' 3)当Python程序当做模块使用时,__name__变 ...

  3. __name__ == '__main__' 到底是什么意思

    __name__ == '__main__'到底是什么意思 相信许多人初学 Python 时,常会在例子程序中看到如下语句: if __name__ == '__main__':foo() # 或其他 ...

  4. if __name__ == __main__:什么意思_好冷的Python if __name__==__main__是啥东东

    在看Python标准库文件或他人写的Python模块时,经常看到py文件最后有这样一段代码: if __name__=='__main__': 'do something' 从代码字面含义理解,如果_ ...

  5. 浅析python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  6. python 中__name__ = '__main__' 的作用

    学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main ...

  7. python中 是什么类型_浅谈python中的变量默认是什么类型

    浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...

  8. python 形参 拷贝_Day124:python中的变量、引用、拷贝

    在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...

  9. python中class变量_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

最新文章

  1. Ubuntu14.04下配置OpenGL及测试代码
  2. Scrum立会报告+燃尽图(十一月十五日总第二十三次):代码规范与技术交流
  3. 树莓派开机运行python脚本_【树莓派】开机自启动脚本方法之一(.Desktop文件)...
  4. 计算机考试时间改革,武汉计算机二级考试时间和改革变化2021
  5. 定制CentOS 5.6精简的自动安装版及心得
  6. 大数据学习笔记:距离度量和相似度度量
  7. 2台电脑一根网线传文件_用1根网线直连2台电脑,能干嘛?
  8. DeepMind的脑补AI再获新技能:看文字知场景、复杂环境、连续视频……
  9. 去掉微信小程序button边框
  10. Gh0st整理资料1
  11. UIWebView的使用---safri
  12. 他捧红了王菲、张学友等近百个巨星,却甘心成为最普通的学佛人…
  13. 一句话+一张图——说清楚Aprioir关联规则算法
  14. Pandas进阶伍 变形
  15. pppoe协议和pppd源码分析
  16. Win10常用快捷键总结
  17. 华为OWS平台和HEC服务浅见
  18. 【洛谷】P1593 因子和
  19. 中通快递关键业务和复杂架构挑战下的 Kubernetes 集群服务暴露实践
  20. 数学建模——房屋贷款问题——python实现

热门文章

  1. NLP重大突破?一文读懂XLNet“屠榜”背后的原理
  2. 大疆、港科大联手!双目3D目标检测实验效果大放送 | CVPR 2019
  3. AI一分钟|Uber撤裁100名无人车操作员;京东金融将融资130亿人民币
  4. 0.38秒!MIT 机器人还原3阶魔方的时间再破记录
  5. 面试:SpringBoot中的条件注解底层是如何实现的?
  6. 模型融合方法最全总结!
  7. 数据挖掘终篇!一文学习模型融合!从加权融合到stacking, boosting
  8. 大型AI已有自主意识了?LeCun开喷Open AI首席科学家
  9. 德国版“非升即走”引发学界震荡!“临时工”干12年也难获教职,网友:全世界都在卷...
  10. Jürgen Schmidhuber发文纪念10年前的研究,网友:转折点非AlexNet?