全部文章

13.__name__ 与 __main__

if __name__ == "__main__": 是 Python 中一个非常重要的代码结构,它的核心作用是区分模块的两种运行方式:直接运行 vs 被导入到其他模块中运行。

具体作用:

  1. 当模块被直接运行时
    Python 会自动将当前模块的 __name__ 变量赋值为 "__main__",这时 if 条件成立,其内部的代码块会被执行。
  2. 当模块被导入到其他模块时
    当前模块的 __name__ 变量会被赋值为模块的文件名(不含 .py 后缀),这时 if 条件不成立,内部的代码块不会执行。

举个例子:

假设你有一个文件 demo.py
# demo.py
def add(a, b):
    return a + b

# 当直接运行 demo.py 时,以下代码会执行
if __name__ == "__main__":
    print("模块被直接运行")
    print(add(2, 3))  # 输出:5

  • 情况 1:直接运行 demo.py
    终端执行 python demo.py,会输出:
     
    模块被直接运行
    5
  • 情况 2:在其他文件中导入 demo.py
    新建 test.py 并导入 demo.py
     
    # test.py
    import demo
    print(demo.add(2, 3))  # 输出:5
     
    此时运行 test.py,只会输出 5,而 demo.py 中 if 内的 "模块被直接运行" 不会被打印。

主要用途:

  1. 作为模块的 "入口程序":可以在模块中写一些测试代码,只有直接运行时才执行。
  2. 避免模块被导入时执行多余代码:确保导入模块时只加载函数 / 类,不执行额外操作。
  3. 模拟程序的主函数:类似其他语言(如 C/C++)中的 main() 函数,让代码结构更清晰。
简单说,它就像一个 "开关",控制代码在不同场景下的执行逻辑。
 
 

 

----------------------------------------------------------------------补充解读---------------------------------------------------------------------

平时我们经常会看到这样的 Python 代码:

if __name__ == "__main__":
    main()

在 Python 中,__name__ 和 __main__ 是两个与模块和脚本执行相关的特殊变量。

__name__ 和 __main__ 通常用于控制代码的执行方式,尤其是在模块既可以作为独立脚本运行,也可以被其他模块导入时。

1. __name__ 变量

__name__ 是一个内置变量,用于表示当前模块的名称。

__name__ 的值取决于模块是如何被使用的:

当模块作为主程序运行时:__name__ 的值被设置为 "__main__"

当模块被导入时:__name__ 的值被设置为模块的文件名(不包括 .py 扩展名)。

假设有一个 module.py 文件:

print(f"模块的 __name__ 值: {__name__}")

输出会是:

模块的 __name__ 值: __main__

2. __main__ 的含义

__main__ 是一个特殊的字符串,用于表示当前模块是作为主程序运行的。

__main__ 通常与 __name__ 变量一起使用,以确定模块是被导入还是作为独立脚本运行。

3. 使用 if __name__ == "__main__": 的常见模式

在 Python 中,常见的做法是在模块的末尾添加以下代码块:

#使用方式1:直接写if语句判断name值,这种情况下,只要本模板被“import”就会运行    print("我现在被外部调用,所以我的__name__=",__name__)
if __name__ == '__main__':
    print('hello,我是被内部调用,所以我的__name__=', __name__)
else:
    print("我现在被外部调用,所以我的__name__=",__name__)

#使用方式2:在方法里进行判断name,从而区分开要执行的逻辑,不过是要目标方法被调用时才会执行
def sayHello():
    if __name__ == '__main__':
        print('hello,我是被内部调用,所以我的__name__=', __name__)
    else:
        print("我现在被外部调用,所以我的__name__=",__name__)

def fun():
    print("我是给外部调用的方法")

总结

  • __name__ 是一个内置变量,表示当前模块的名称。

  • 当模块作为主程序运行时,__name__ 的值是 "__main__"

  • 当模块被导入时,__name__ 的值是模块的文件名。

  • 使用 if __name__ == "__main__": 可以控制模块在被导入时不会执行某些代码,而只有在作为独立脚本运行时才会执行这些代码。

 

跨平台最佳实践

无论系统如何,始终将多进程逻辑包裹在 if __name__ == '__main__': 中,原因如下:

    1. 避免 Windows 递归错误
      确保代码在 Windows 上可运行。

    2. 防止意外副作用
      避免子进程重复执行模块级别的初始化代码(如日志配置、资源加载)。

    3. 提升代码可读性
      明确区分模块导入和直接执行的逻辑。

posted @ 2025-03-13 10:02  指尖下的世界  阅读(25)  评论(0)    收藏  举报