在 Python 中,if __name__ == "__main__":
是一个常用的代码片段,用来判断当前脚本是否被直接运行而非被导入到其他脚本中。__name__
是一个内置变量1,如果模块被直接执行,__name__
的值会被设置为 "__main__"
;如果文件被导入到其他模块,则 __name__
的值会被设置为该模块的名称。这种机制通常用于模块的测试代码,或当脚本既可以被导入为模块使用,又可以作为独立脚本执行时。
下面是一个简单的示例,演示如何使用 if __name__ == "__main__":
:
1# main_example.py
2def main():
3 print("Hello from main function.")
4
5def do_something():
6 print("This is a function that does something.")
7
8
9if __name__ == "__main__":
10 main() # 只有当文件被直接运行时,main() 函数才会执行。
如果直接运行 main_example.py
,输出将是:
1Hello from main function.
这是因为 __name__ == "__main__"
为真,所以 main()
函数会被调用。然而,如果导入这个模块到另一个脚本中,比如:
1# import_example.py
2import main_example
3main_example.do_something()
当运行 import_example.py
时,main()
函数不会被执行,只有 do_something()
函数的输出会显示:
1This is a function that does something.
这说明 main_example.py
被作为模块导入时,其 __name__
值不是 "__main__"
,因此 main()
函数内的代码并未执行。
如果去掉 if __name__ == "__main__":
这个判断,那么当 main_example.py
文件被直接运行或被导入为一个模块时,文件中顶层的代码将无条件执行。例如,如果修改 main_example.py
如下:
1# main_example.py
2def main():
3 print("Hello from main function.")
4
5def do_something():
6 print("This is a function that does something.")
7
8
9main() # 这行代码现在没有包含在 if __name__ == "__main__": 判断中
现在,不管是直接运行 main_example.py
还是将其作为模块导入到其他脚本中,main()
函数都会被执行。
-
直接运行
main_example.py
:运行结果将是:
1Hello from main function.
这与之前有
if __name__ == "__main__":
时直接运行的结果相同。 -
将
main_example.py
导入到另一个脚本中:假设有另一个脚本
import_example.py
,内容如下:1# import_example.py 2import main_example 3main_example.do_something()
当运行
import_example.py
时,输出将是:1Hello from main function. 2This is a function that does something.
这与之前有
if __name__ == "__main__":
判断时的行为不同。在那种情况下,当模块被导入时,main()
函数不会执行。但现在,由于缺少了这个判断,main()
在模块被导入时就会执行。
这就展示了使用 if __name__ == "__main__":
的好处:它允许我们控制某些代码块只在该模块被直接执行时运行,而在模块被导入时不运行,从而提供更大的灵活性和模块化。
参考资料
- Custom Libraries (at 01:10:06) in CS50P - Lecture 4 - Libraries
- What Does if
__name__ == "__main__"
Do in Python? __main__
— Top-level code environment
-
Python 中的内置变量是指那些预先定义在 Python 解释器中的变量。这些变量可在程序运行时直接使用,无需事先声明或定义。内置变量是 Python 的一部分,为开发者提供了便利,使我们能够访问和控制 Python 解释器的特定方面或与程序的执行环境进行交互。Python 中的重要内置变量有:(1)
__name__
:这个变量用于表示当前模块的名字。如果模块被直接运行,__name__
的值将是'__main__'
;如果是被导入,值则是模块的名字。(2)__doc__
:存储了模块的文档字符串,如果没有文档字符串,则为None
。(3)__file__
:这个变量包含了当前文件的路径。这在确定文件的位置或构建路径时很有用。(4)__package__
:表示当前模块所在的包。(5)__builtins__
:此变量提供了对所有内建函数和变量的访问,这些内建函数和变量是随时可用的,如print()
,len()
等。这些内置变量为 Python 程序提供了额外的上下文信息,并帮助开发者编写更加灵活和强大的代码。使用这些内置变量时,不应该对它们重新赋值或修改,因为这可能会导致程序的行为变得不可预测,或与 Python 的未来版本不兼容。 ↩︎