知行编程网知行编程网  2022-06-06 17:00 知行编程网 隐藏边栏 |   抢沙发  12 
文章评分 0 次,平均分 0.0

Python中的 __name__ 变量,到底是个什么东西?

编译&图片汉化 | 欧剃

编辑 | 深度学习这件小事
大家应该已经在很多 Python 脚本里见到过 __name__ 变量了吧?它经常是以类似这样的方式出现在我们的程序里:
<section style="padding: 0.5em;white-space: pre-wrap;font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;overflow: auto;border-radius: 3px;border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);background: rgb(35, 36, 31);text-size-adjust: none;color: rgb(248, 248, 242);margin-left: 8px;margin-right: 8px;display: block !important;"><span style="color: rgb(249, 38, 114);">if</span> __name__ == <span style="color: rgb(230, 219, 116);">'__main__'</span>:<br  />    main()</section>
今天,我就带大家详细扒一扒这个内置变量的用法,示范一下在你写的 Python 模组里要怎么用到它。

   这个 __name__ 拿来做什么的?

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

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

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

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

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

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

Python中的 __name__ 变量,到底是个什么东西?

情况 1 - 直接运行脚本


假设我们有一个nameScript.py,代码如下:
<section style="padding: 0.5em;white-space: pre-wrap;font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;overflow: auto;border-radius: 3px;border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);background: rgb(35, 36, 31);text-size-adjust: none;color: rgb(248, 248, 242);margin-left: 8px;margin-right: 8px;display: block !important;"><span style="color: rgb(249, 38, 114);"><span style="color: rgb(102, 217, 239);">def</span> <span style="color: rgb(166, 226, 46);">myFunction</span><span style="color: rgb(248, 248, 242);">()</span>:</span><br  />    print(<span style="color: rgb(230, 219, 116);">'变量 __name__ 的值是 '</span> + __name__)<br  /><span style="color: rgb(249, 38, 114);"><span style="color: rgb(102, 217, 239);">def</span> <span style="color: rgb(166, 226, 46);">main</span><span style="color: rgb(248, 248, 242);">()</span>:</span><br  />    myFunction()<br  /><span style="color: rgb(249, 38, 114);">if</span> __name__ == <span style="color: rgb(230, 219, 116);">'__main__'</span>:<br  />    main()</section>
当你直接执行 nameScript.py 时,流程是这样处理的:

Python中的 __name__ 变量,到底是个什么东西?

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

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

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


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

假设 importingScript.py 的内容如下:
<section style="padding: 0.5em;white-space: pre-wrap;font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;overflow: auto;border-radius: 3px;border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);background: rgb(35, 36, 31);text-size-adjust: none;color: rgb(248, 248, 242);margin-left: 8px;margin-right: 8px;display: block !important;"><span style="color: rgb(249, 38, 114);">import</span> nameScript <span style="color: rgb(249, 38, 114);">as</span> ns<br  />ns.myFunction()</section>
这时,我们就有了两个不同的作用域:一个是 importingScript 的,一个是 nameScript 的。让我画个示意图,你就能看出这和之前的区别了:

Python中的 __name__ 变量,到底是个什么东西?

 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__ 变量在模组中的特性,分析了不同的调用方式对它的值有什么影响。利用这个特性,你既可以在程序中导入模组来使用,也可以直接把模组本身作为程序来运行。

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

<pre style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><p style="max-width: 100%;letter-spacing: 0.544px;white-space: normal;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;widows: 1;line-height: 1.75em;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;font-size: 16px;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;box-sizing: border-box !important;overflow-wrap: break-word !important;">—</span></strong>完<strong style="max-width: 100%;font-size: 16px;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;font-size: 16px;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;box-sizing: border-box !important;overflow-wrap: break-word !important;">—</span></strong></span></strong></span></strong></p><section style="max-width: 100%;letter-spacing: 0.544px;white-space: normal;font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;widows: 1;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section powered-by="xiumi.us" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="margin-top: 15px;margin-bottom: 25px;max-width: 100%;opacity: 0.8;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section powered-by="xiumi.us" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="margin-top: 15px;margin-bottom: 25px;max-width: 100%;opacity: 0.8;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section><p style="margin-bottom: 15px;padding-right: 0em;padding-left: 0em;max-width: 100%;color: rgb(127, 127, 127);font-size: 12px;font-family: sans-serif;line-height: 25.5938px;letter-spacing: 3px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;color: rgb(0, 0, 0);box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;font-size: 16px;font-family: 微软雅黑;caret-color: red;box-sizing: border-box !important;overflow-wrap: break-word !important;">为您推荐</span></strong></span></p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;">MIT校长评中美科技竞赛:胜利不是期盼对手的失利</p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="font-size: 14px;">GitHub重大更新:在线开发上线,是时候卸载IDE了</span></p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="font-size: 14px;">美国官宣117000名 IT 人失业,真是史无前例!</span><br  /></p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;">数据分析入门常用的23个牛逼Pandas代码</p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;">知乎高赞:985计算机视觉毕业后找不到工作怎么办?<br  /></p></section></section></section></section></section></section></section></section>
Python中的 __name__ 变量,到底是个什么东西?

本篇文章来源于: 深度学习这件小事

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享