什么是if __name__ == "__main__":
是吗?
概述基本内容:
全局变量,__name__
,在您的程序程序输入点的模块中,是'__main__'
否则,它就是您导入模块的名称 。
所以,代码在if
块只当模块是程序输入点时才会运行。
它允许模块中的代码可被其他模块导入,而不执行进口时的代码块。
为什么我们需要这个?
制定和测试您的守则
说你正在写一个Python脚本 设计成一个模块:
def do_important():
"""This function does something very important"""
你,你,你能够将函数的调用点添加到底部以测试模块 :
do_important()
并运行它,它有类似的东西:
~$ python important.py
问题
但是,如果您想要将模块导入到另一个脚本:
import important
进口时do_important
函数将被调用, 所以您可能会评论 您的函数调用,do_important()
,在底部。 ,在底部。
# do_important() # I must remember to uncomment to execute this!
然后你必须记住,你是否已经评论了自己的测试功能调用。 而这种额外的复杂性 将意味着你可能会忘记, 让你的发展进程更加麻烦。
更好的方法
缩略__name__
变量指向命名空间, Python 解释器此时恰好在哪里。
在导入模块中,它是该模块的名称。
但在主模块(或互动的 Python 会话, 即口译员的读、 Eval、 打印圈或 REPL) 内, 您正在运行来自它的一切"__main__"
.
如果您在执行前检查 :
if __name__ == "__main__":
do_important()
有了以上内容, 您的代码只有在运行为主模块时才会执行( 或者故意从其它脚本中调用它 ) 。
更好的办法
不过有种共音法可以改进
如果我们想从模块之外运行这个业务流程呢?
如果我们把代码放进去, 我们想在开发过程中练习, 在这样的功能中进行测试, 然后核对'__main__'
紧接其后:
def main():
"""business logic for when running this module as the primary one!"""
setup()
foo = do_important()
bar = do_even_more_important(foo)
for baz in bar:
do_super_important(baz)
teardown()
# Here's our payoff idiom!
if __name__ == '__main__':
main()
我们现在的模块末端有一个最终功能,如果我们将模块作为主模块运行,该功能将运行。
它将允许模块及其功能和类别输入到其他脚本,而不运行main
函数, 并允许模块( 及其函数和类) 运行时调用该模块( 及其函数和类) 。'__main__'
模块,即
import important
important.main()
在Python文件中,也可以找到这种语言,作为解释。__main__
模块。案文规定:
本模块代表了口译员主要程序执行范围(否则是匿名的)——从标准输入、脚本文件或交互式提示读取的命令。正是在这个环境中,特殊“有条件脚本”的阶梯导致脚本运行:
if __name__ == '__main__':
main()