使用这种形式查找代码很常见:
def hacer_algo():
print("algo")
if __name__ == "__main__":
hacer_algo()
而不是,例如:
def hacer_algo():
print("algo")
hacer_algo()
我们也注意到这个变量__name__
不是我们初始化的,而是存在于环境中的。
- 有什么区别?
- 为什么偏爱一个而不是另一个?
- 它是什么以及它是如何工作的?
使用这种形式查找代码很常见:
def hacer_algo():
print("algo")
if __name__ == "__main__":
hacer_algo()
而不是,例如:
def hacer_algo():
print("algo")
hacer_algo()
我们也注意到这个变量__name__
不是我们初始化的,而是存在于环境中的。
这与 Python 解释器的工作方式密切相关:
当解释器读取一个代码文件时,它会执行在其中找到的所有全局代码。这涉及为任何函数或类定义的和全局变量创建对象。
Python 中的每个模块(代码文件)都有一个名为的特殊属性,该属性
__name__
定义了它运行的命名空间。它用于唯一标识导入系统中的模块。另一方面
"__main__"
,它是执行更高级别代码(您的主程序)的范围的名称。如果模块作为主程序运行,则shell 会将属性的值传递
__name__
给字符串(当您通过在终端中调用 shell来运行它时,双击它,在交互式 shell 中运行它等等)。'__main__'
python my_modulo.py
如果该模块不作为主程序调用,而是从另一个模块导入,则该属性
__name__
成为文件本身的名称。这是官方文档。
也就是说,如果您有一个名为 的文件
mi_modulo.py
,如果我们将其作为主程序执行,则属性__name__
将为,如果我们通过从另一个模块 ( )'__main__'
导入它来使用它,则属性将等于.import mi_modulo
__name__
'mi_modulo'
基本上,您使用
if __name__ == “__main__”:
的是查看模块是否已直接执行(导入)。如果已作为主程序执行,则执行条件内的代码。这样做的原因之一是有时您编写一个可以直接执行的模块(.py 文件),但也可以在另一个模块中导入和重用其函数、类、方法等。
例如,在图形框架中,通常会生成一个使用该模块中定义的一个或多个小部件的示例,作为使用示例并测试模块本身。如果您运行该模块,我们将有一个示例图形界面,但不用说,当我们导入模块以使用小部件时,我们不希望为了艺术而出现一个小窗口。Kivy框架中的一个真实示例:
通过使用条件,我们实现了直接执行模块与从另一个模块导入模块时的执行不同。导入模块时,解释器将完全忽略条件中的所有内容,但作为主模块运行时则不会。
要查看它是如何工作的,您可以尝试一些代码(按照您自己的示例):
您创建一个我们将调用的模块
mi_modulo.py
:在同一个文件夹中,您创建另一个我们将调用的模块
principal.py
如果
mi_modulo.py
直接运行脚本:__name__
will的值"__main__"
和里面的块将被执行if __name__ == “__main__”:
:如果我们通过导入来执行
principal.py
它使用的文件mi_modulo.py
,则条件不成立,if __name__ == “__main__”
所以只执行全局代码(print
初始代码和函数对象hacer_algo
在内存中创建)。该函数仅在我们从主模块调用它时才会执行:现在让我们将脚本更改
mi_modulo.py
为:如果我们将它作为主程序执行,结果与以前相同,但如果我们现在执行它,
principal.py
我们会得到:发生的情况是,在导入时,我们执行了导入模块的所有代码,包括对现在未包装在条件中的函数的调用。导入后,主模块再次调用导入的函数。
简而言之,如果您始终将脚本作为主程序执行,则您放置的两种形式是有效的,如果您还通过导入它来使用它,如果您自己不调用函数并且通常不希望执行代码并且是使用的原因
if __name__ == “__main__”:
声明
if
,类型:它用于隔离或解耦程序
(bloque de cosas dentro)
内的执行(条件为真),当所述程序完全导入另一个程序时。在那种情况下,当执行另一个时,它不会被执行
(bloque de cosas dentro)
,因为它有一个错误的条件。这让我可以用同一个程序做不同的事情(直接与导入)。
它是程序的主要功能,用于初始化程序,为此您只需在 cmd 中执行以下操作:
并且程序被初始化并执行。另一方面,为什么要使用这种方法,因为您可以启动它,或者当您想将其添加为模块时,程序将无法启动,我认为这是唯一的区别。
向社区中的所有人问好,我将贡献我的一粒沙子并尽可能简单地解释它,因为我理解许多像我一样当时无法理解这句话或更确切地说是这种情况的人。
如果 __ name__ == "__ main__":
这个条件只是做一个查询来检查正在执行的文件是程序的主文件还是根文件。在 Python 中,方法 __ name__ 是您的文件名 示例:calculator.py >> 它将 __ name__ 您的 .py 文件的名称与 __ main__ 进行比较具有最大的层次结构。
但你肯定想知道这有什么意义吗?如果我想让程序运行,我为什么要浪费时间创建条件,仅此而已!
答案是,我们想象一个包含数千个 .py 文件的应用程序,他们分配给您的项目是其他人已经在做的,您怎么知道哪个是您的根文件?什么是一切的开始?也许你从一个你认为是根的开始,但它不是!
我认为这将是为什么使用 if __ name__ == "__ main__" 的主要原因之一(在众多原因中)
这不是强制性的,但使用它是一种很好的做法,我希望我已经很好地解释了自己,并且可以在社区中贡献我的一粒沙子。向所有同事问好。