2024-04-09    2024-08-16     1351 字  3 分钟

在 Python 中,if __name__ == "__main__": 是一个常用的代码片段,用来判断当前脚本是否被直接运行而非被导入到其他脚本中。__name__ 是一个内置变量1,如果模块被直接执行,__name__ 的值会被设置为 "__main__";如果文件被导入到其他模块,则 __name__ 的值会被设置为该模块的名称。这种机制通常用于模块的测试代码,或当脚本既可以被导入为模块使用,又可以作为独立脚本执行时。

下面是一个简单的示例,演示如何使用 if __name__ == "__main__":

# main_example.py
def main():
    print("Hello from main function.")

def do_something():
    print("This is a function that does something.")


if __name__ == "__main__":
    main()  # 只有当文件被直接运行时,main() 函数才会执行。

如果直接运行 main_example.py,输出将是:

Hello from main function.

这是因为 __name__ == "__main__" 为真,所以 main() 函数会被调用。然而,如果导入这个模块到另一个脚本中,比如:

# import_example.py
import main_example
main_example.do_something()

当运行 import_example.py 时,main() 函数不会被执行,只有 do_something() 函数的输出会显示:

This is a function that does something.

这说明 main_example.py 被作为模块导入时,其 __name__ 值不是 "__main__",因此 main() 函数内的代码并未执行。

如果去掉 if __name__ == "__main__": 这个判断,那么当 main_example.py 文件被直接运行或被导入为一个模块时,文件中顶层的代码将无条件执行。例如,如果修改 main_example.py 如下:

# main_example.py
def main():
    print("Hello from main function.")

def do_something():
    print("This is a function that does something.")


main()  # 这行代码现在没有包含在 if __name__ == "__main__": 判断中

现在,不管是直接运行 main_example.py 还是将其作为模块导入到其他脚本中,main() 函数都会被执行。

  1. 直接运行 main_example.py:

    运行结果将是:

    Hello from main function.
    

    这与之前有 if __name__ == "__main__": 时直接运行的结果相同。

  2. main_example.py 导入到另一个脚本中:

    假设有另一个脚本 import_example.py,内容如下:

    # import_example.py
    import main_example
    main_example.do_something()
    

    当运行 import_example.py 时,输出将是:

    Hello from main function.
    This is a function that does something.
    

    这与之前有 if __name__ == "__main__": 判断时的行为不同。在那种情况下,当模块被导入时,main() 函数不会执行。但现在,由于缺少了这个判断,main() 在模块被导入时就会执行。

这就展示了使用 if __name__ == "__main__": 的好处:它允许我们控制某些代码块只在该模块被直接执行时运行,而在模块被导入时不运行,从而提供更大的灵活性和模块化。

参考资料


  1. Python 中的内置变量是指那些预先定义在 Python 解释器中的变量。这些变量可在程序运行时直接使用,无需事先声明或定义。内置变量是 Python 的一部分,为开发者提供了便利,使我们能够访问和控制 Python 解释器的特定方面或与程序的执行环境进行交互。Python 中的重要内置变量有:(1)__name__:这个变量用于表示当前模块的名字。如果模块被直接运行,__name__ 的值将是 '__main__';如果是被导入,值则是模块的名字。(2)__doc__:存储了模块的文档字符串,如果没有文档字符串,则为 None。(3)__file__:这个变量包含了当前文件的路径。这在确定文件的位置或构建路径时很有用。(4)__package__:表示当前模块所在的包。(5)__builtins__:此变量提供了对所有内建函数和变量的访问,这些内建函数和变量是随时可用的,如 print(), len() 等。这些内置变量为 Python 程序提供了额外的上下文信息,并帮助开发者编写更加灵活和强大的代码。使用这些内置变量时,不应该对它们重新赋值或修改,因为这可能会导致程序的行为变得不可预测,或与 Python 的未来版本不兼容。 ↩︎