likes
comments
collection
share

为什么要写 __name__ == “__main__”

作者站长头像
站长
· 阅读数 42

在Python中,__name__ == "__main__" 用于确定一个模块是作为脚本直接运行还是被另一个模块导入。

1. 模块和脚本

  • 模块:模块是一个包含Python代码的文件,可以通过import语句在其他Python文件中导入。
  • 脚本:脚本是一个可以直接运行的Python文件。

2. __name__ 变量

  • __name__ 是一个特殊的内置变量。当Python解释器运行一个模块时,它会为该模块定义一些特殊变量,其中之一就是 __name__
  • 如果模块是被直接运行的,那么 __name__ 的值将是 "__main__"
  • 如果模块是被导入的,那么 __name__ 的值将是模块的名字(即模块文件名,不包括路径和文件扩展名)。

3. 示例

考虑以下代码:

# example.py
def main():
    print("This is the main function.")

if __name__ == "__main__":
    main()

直接运行模块

如果你直接运行 example.py

python example.py

输出将是:

This is the main function.

这是因为当 example.py 被直接运行时,__name__ 的值是 "__main__",因此 if 条件为真,main() 函数被调用。

导入模块

如果你在另一个文件中导入 example 模块:

# another_file.py
import example

没有输出。这是因为当 example 模块被导入时,__name__ 的值是 "example",而不是 "__main__",因此 if 条件为假,main() 函数不会被调用。

修改name

__name__修改为文件的名称

# example.py
def main():
    print("This is the main function.")

if __name__ == "example":
    main()

这样在其他的文件中调用这个module时会输出内容。

本质和用途

  • 模块重用:通过使用 if __name__ == "__main__",你可以将模块中的代码组织成可重用的函数和类,同时保留一些只能在直接运行时执行的代码。这有助于代码的模块化和重用。
  • 测试代码:你可以在 if __name__ == "__main__" 块中包含测试代码。这些代码只有在直接运行模块时才会执行,而在导入模块时不会执行。

使用main的用途

假设有两个文件 module.pymain.py

# module.py
def function():
    print("Function in module.")

if __name__ == "__main__":
    print("Module is being run directly.")
else:
    print("Module has been imported.")
# main.py
import module
module.function()

运行 module.py

python module.py

输出:

Module is being run directly.

运行 main.py

python main.py

输出:

Module has been imported.
Function in module.

使用example的用途

在Python中,__name__ 变量的常用值有 "__main__" 和模块的名称(例如 "example")。虽然 __name__ == 'example' 这种写法并不常见,但它确实可以用于一些特定场景。以下是一些可能的使用场景:

特定模块初始化

某个特定模块被导入时执行一些初始化代码。例如:

# module.py
def initialize():
    print("Initializing module...")

if __name__ == "module":
    initialize()

在这种情况下,如果模块 module 被导入,初始化代码将会被执行。

4.总结

if __name__ == "__main__" 模式在Python中用于区分模块是被直接运行还是被导入。通过这种模式,可以编写既可以作为独立脚本运行又可以作为模块导入的代码,从而提高代码的重用性和可维护性。

转载自:https://juejin.cn/post/7388347353407799333
评论
请登录