🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/
让我们一起来详细探讨一下这个问题:if __name__ == "__main__":
的作用是什么?
背景:在 Python 中,每个 .py 文件其实都可以被视为一个模块(module)。这些模块可以包含函数、变量、类等。当我们运行一个 Python 脚本时,Python 解释器会执行该脚本中的代码。但是,有时我们也会将一个模块导入到其他脚本中,以便在其他地方重用其中的功能。
那么我们如何区分一个模块是直接被执行,还是被导入到其他模块中呢?
解决方案:
- 这就是
if __name__ == "__main__":
的妙用! - 当一个 Python 文件被直接执行时,Python 解释器会将该文件的
__name__
设置为特殊值"__main__"
。这意味着,如果我们在文件中使用了这个条件,那么在这行代码下面的代码只有在直接执行该文件时才会被执行。 - 如果这个文件被导入到其他模块中,
__name__
的值将是模块的名称,而不是"__main__"
。因此,通过这个条件,我们可以控制哪些代码只在直接执行时运行,而在导入时不运行。
示例:
在 test.py
中编写如下 Python 代码:
print("This is test.py")
print(f"__name__: {__name__}")def say_hello():print("Hello from my_module!")if __name__ == "__main__":print("This code runs when test.py is directly executed.")
我们直接运行 test.py,会得到以下输出:
This is test.py
__name__: __main__
This code runs when test.py is directly executed.
但如果我们在另一个 Python 脚本或 Jupyter Notebook 中导入了 test
模块,则不会看到 This code runs when test.py is directly executed.
这行输出。如下示意:
import_test.py:
import test
__name__
是 Python 中一个特殊的内置变量,用于表示当前模块的名称(作为模块标识),它的值取决于当前代码运行的环境。一个 Python 文件,它如果被直接运行,其 __name__
的值是 __main__
。但如果该文件被导入到另一个文件中,__name__
的值则是文件名(Python 文件本身的名称去掉 .py 后缀),比如这里的 test
。这个变量通常用于编写可重用的模块,因为它允许检查模块是被导入的还是被直接运行。总之,__name__
变量帮助我们判断代码是被直接运行还是被导入到其他程序中,从而更高效地重用代码。
__name__ == "__main__"
是什么意思?
- 当一个 Python 模块在最高层级代码环境中执行时,它的
__name__
会被设为字符串"__main__"
。 - 这个最高层级代码环境通常是用户指定最先启动运行的 Python 模块,也被称为应用的 “入口点”。它还会导入程序所需的所有其他模块。
因此,if __name__ == "__main__":
这行代码就是作为一个条件限制,在它下面的代码只有在直接运行这个 test.py 文件的时候才会执行,当作为模块在别的 .py 文件或 Jupyter Notebook 中调用的时候,test.py 中这行代码下面的代码不会被执行。
作用 🐍🚀:
- 这个特性非常有用,因为它允许我们在开发和测试阶段直接运行脚本,同时在作为模块被导入时不执行测试的代码。
- 想象一下,如果我们在一个大型软件项目中有很多模块,每个模块都有一些测试代码。我们只想在直接运行模块时执行这些测试代码,而在其他地方导入时不执行。这时,
if __name__ == "__main__":
就派上了用场。if __name__ == "__main__":
块内部可以包含用于单元测试的代码。你可以在这里编写测试用例,验证模块的功能是否正常。 - 总之,
if __name__ == "__main__":
是一个重要的 Python 构造,它让我们的代码更加灵活、可重用。
注意事项 🤡:
- 模块导入和执行顺序:在 Python 中,当一个脚本作为主程序执行时,它会从上到下按顺序执行。如果你在
if __name__ == "__main__":
块之外执行一些操作,这些操作可能会在其他模块导入之前执行,导致意外的行为。因此,确保将主要逻辑放在if __name__ == "__main__":
块内。 - 此外,当需要进行调试时,也可以在
if __name__ == "__main__":
块中添加调试输出语句,以便了解程序的执行过程。但在最终版本中,不要忘记移除或禁用这些调试输出。 - 避免全局变量:在
if __name__ == "__main__":
下面定义的变量对整个模块来说就是全局变量。这可能会影响其他模块的行为。为了避免命名空间冲突,尽量将变量和函数封装在类或函数内部,而不是直接在全局作用域中定义。 - 避免执行不必要的代码:在
if __name__ == "__main__":
块内,只放置与主程序相关的代码。避免在这里执行不必要的初始化、计算或其他操作,以提高性能并减少不必要的资源消耗。 - 文档和注释:在
if __name__ == "__main__":
块之前,添加适当的文档字符串和注释,以便其他开发人员了解模块的用途、功能和使用方法。良好的文档和注释有助于项目的可维护性和可读性。