✨✨✨if __name__ == "__main__" 在 Python 中意味着什么?
- 1. 原理
- 2. 总结
- 参考
在阅读其他人的代码时,你可能遇到过 Python 的 if__name__ == “main” 习惯用法。这篇博客将了解有关 Python if name == “main” 习惯用法的所有信息。
1. 原理
这是一个 if 语句,检查名为__name__ 的变量是否等于字符串__main__,并且 name 和 main 前后有两个下划线。
首先,说 if__name__ == “main” 有点拗口。简而言之,可以将其称为名称主要习语(name-main)。
调用repeat()函数,然后将其打印出来,有两种方法:
- 将其作为脚本运行;
- 将其作为模块导入;
模块导入时,即使只导入一个函数,也会首先执行整个文件,然后导入定义。
if__name__ ==__main__实际上在做什么呢?它允许:
- 指定一些仅在文件作为脚本运行时执行的代码;
- 并且当文件作为模块导入时不会执行;
__name__是所谓的 dunder 变量,Python 使用 dunder 变量来存储元数据,元数据是有关其正在运行的程序的数据。 _name 变量存储模块加载时的名称。关于 dunder 的旁注:Python 语言中有很多 dunder,包括 dunder 变量和 dunder 方法。 00:55 name 只是您最有可能首先遇到的一个,称它们为 dunders,因为它们的名称开头和结尾都有双下划线。Python 使用这种奇怪的命名约定将其标记为保留供 Python 使用。 它们故意看起来丑陋、奇怪或复杂,因为普通程序员永远不会想在自己的代码中使用这种命名约定。
您也不应该创建自己的 dunders,因为它们可能与 Python 当前的 dunders 或将来的 Python 版本中可能使用的 dunders 发生冲突。
对于模块,name 变量设置为“main”字符串(如果位于顶级代码环境中)或模块的名称(如果正在导入)。
但当不是顶级代码环境时,会被设置为具体的方法名,因此 if name == “main” 并不相等,所以不会执行;
2. 总结
if__name__ == main 称呼为name-main 习语。它检查文件是否直接作为脚本运行或作为模块导入,并且它允许您在一种条件下运行某些代码,而不是在另一种条件下运行。
它使用常规的 if 语句,并利用 Python 的全局__name__变量来存储模块的名称,如果它位于顶级代码环境中,则该变量将为__main__。 它不是像其他语言中的 main() 函数那样的官方入口点。它通常用于为模块创建命令行入口点,如果您出于其他原因使用它,请首先考虑其他替代方案,特别是当程序更大或更复杂时。
if__name__ =="main"允许您编写在将文件作为脚本运行时执行的代码,但在将其作为模块导入时则不执行。当您想要在脚本运行期间收集用户输入并避免导入模块时产生副作用(例如,对其功能进行单元测试pytest,doctest)时,最好使用它。 您还需要了解一些常见但次优的用例,并了解在这些场景中可以采取的更好、更惯用的方法。
参考
- https://realpython.com/courses/if-name-main-python/