美文网首页
Python中“if __name__=='__main__':

Python中“if __name__=='__main__':

作者: 羋学僧 | 来源:发表于2023-03-18 16:32 被阅读0次

    我们写代码的时候,经常会用到if __name__ == "__main__"

    它的使用背后的机制、它的优点、以及它可以用在什么地方

    一、__name__属性和__main__范围

    __name__ 属性默认为当前局部范围内的一个名字。

    当我们运行一个 Python 脚本或将我们的代码作为一个模块导入时,Python 解释器会自动添加这个值。

    在你的 Python 解释器上试试下面的命令。你可能会发现 __name__ 属于 dir() 的属性列表:

    print(dir())
    
    ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
    

    Python 中的 __name__ 是一个特殊的变量,它定义了类的名称或当前模块的名称,或被调用的脚本的名称。

    创建一个名为 name_scripts 的新文件夹,这样我们就可以写一些脚本来了解这一切是如何工作的。

    在该文件夹中创建一个新文件,script1.py,代码如下:

    print(f'The __name__ from script1 is "{__name__}"')
    

    你会发现 ,最终的输出如下:

    The __name__ from script1 is "__main__"
    

    默认情况下,当一个脚本被执行时,解释器会读取该脚本并将字符串 __main__ 赋值给 __name__ 关键字。

    所以,当我们直接在命令行下执行脚本时,添加if __name__ == "__main__"就会执行当前脚本代码

    当上面的脚本被导入到另一个脚本中时,情况变得更加有趣。考虑一个名为 script2.py 的 Python 文件,其代码如下:

    import script1
    
    print(f'The __name__ from script2 is "{__name__}"')
    

    输出结果为:

    The __name__ from script1 is script1
    The __name__ from script2 is "__main__"
    

    可以看到,当脚本被执行时,输出结果是以script1的形式表示脚本的名称。最后的打印语句是在 script2 的范围内,当它被执行时,输出被打印为:__main__

    现在我们理解了 Python 是如何使用 __name__ 作用域的,以及当它给它一个__main__的值时,让我们看看为什么我们在执行代码前要检查它的值。

    二、if __name__ == "__main__"作用

    我们使用 if语句来运行代码块,只有当我们的程序是被执行的主程序时。这使得我们的程序本身可以执行,但对其他可能想导入某些功能的Python模块很友好,而不必运行代码。

    考虑一下下面的Python程序:

    script3.py包含一个叫做add()的函数,它只从主环境中被调用:

    def add(a, b):
        return a+b
    
    
    if __name__ == "__main__":
        print(add(2, 3))
    

    由于脚本被直接执行,__name__关键字被分配给__main__,并且在if __name__ == "__main__"条件下的代码块被执行。

    这是在命令行下执行的结果,加入我们直接导入的话会怎么样呢?

    import script3
    
    print(f"{script3.__name__}")
    

    输出结果为:

    script3
    

    script3.py 中 if __name__ == "__main__" 下的块没有执行,和预期的一样。

    这是因为 __name__ 关键字现在被赋予了脚本的名称:script3。

    三、使用场景

    简单概括一下if __name__ == "__main__"的使用场景:

    • 测试过程中,为了保证代码正常运行,且这个代码需要被导入到另外一个脚本时,在这种情况下,我们通常不希望该脚本作为主模块运行。这样,就可以在导入和命令行测试情况下会有不同的执行和结果。
    • 创建一个库,但希望为用户做一个演示或其他特殊的运行时情况。通过使用这个 if 语句,使用你的代码作为库的 Python 模块就不会受到影响

    相关文章

      网友评论

          本文标题:Python中“if __name__=='__main__':

          本文链接:https://www.haomeiwen.com/subject/uvasrdtx.html