Python作为一门灵活的解释型语言,没有像Java、C++那样强制要求定义main函数作为程序入口,但社区形成了约定俗成的main()函数惯用法,核心就是通过if __name__ == '__main__':来判断代码执行场景。

什么是__name__属性
每个Python模块都有一个内置的__name__属性,这个属性的值会根据模块的加载方式发生变化:
- 当模块被直接作为脚本执行时,
__name__的值会被自动设置为'__main__' - 当模块被其他文件通过
import语句导入时,__name__的值会被设置为模块的文件名(不包含.py后缀)
我们可以通过一段简单代码验证这个特性:
# test_module.py
print("当前模块的__name__属性值为:", __name__)
if __name__ == '__main__':
print("该模块是作为独立脚本执行的")
else:
print("该模块是被其他文件导入的")
直接运行test_module.py时,输出结果为:
当前模块的__name__属性值为: __main__ 该模块是作为独立脚本执行的
如果在另一个文件中导入这个模块:
# import_demo.py import test_module
运行import_demo.py的输出结果为:
当前模块的__name__属性值为: test_module 该模块是被其他文件导入的
main()函数惯用法的标准写法
实际开发中,我们通常会把需要直接执行的逻辑封装到一个名为main的函数中,再通过if __name__ == '__main__':调用这个函数,标准写法如下:
def main():
# 这里写脚本的核心执行逻辑
print("程序开始执行")
# 调用其他功能函数
func_a()
func_b()
print("程序执行结束")
def func_a():
print("执行功能A")
def func_b():
print("执行功能B")
if __name__ == '__main__':
main()
这种惯用法的核心作用
1. 区分模块执行场景
避免模块被导入时执行不必要的代码。比如你写了一个工具模块,里面包含一些工具函数,同时你也为这个模块写了测试代码,把测试代码放到if __name__ == '__main__':块中,其他文件导入这个模块时就不会执行测试逻辑。
2. 提升代码可维护性
把执行逻辑封装到main函数中,代码结构更清晰,后续修改执行流程只需要调整main函数内部的内容即可,不需要改动判断逻辑部分。
3. 支持命令行参数解析
当脚本需要接收命令行参数时,通常会在main函数中处理参数解析逻辑,比如结合argparse模块使用:
import argparse
def main():
# 创建参数解析器
parser = argparse.ArgumentParser(description="示例脚本")
# 添加命令行参数
parser.add_argument("-n", "--name", type=str, help="输入名称")
# 解析参数
args = parser.parse_args()
if args.name:
print(f"你好, {args.name}")
else:
print("未输入名称")
if __name__ == '__main__':
main()
常见使用误区
- 不要在
if __name__ == '__main__':块之外写大量执行逻辑,否则模块被导入时这些逻辑会被执行,不符合模块设计的预期 main函数不是必须的,你也可以直接在if __name__ == '__main__':块中写执行代码,但封装成函数更符合代码规范- 不要在其他模块中调用
if __name__ == '__main__':块中的代码,这个块的逻辑只应该在模块作为脚本直接执行时触发
总结
Python的main()函数惯用法是社区长期实践形成的规范,核心是利用__name__属性的特性区分模块的执行场景。掌握这个写法能让你写出更符合Python生态规范的代码,既能保证脚本直接运行时的正常逻辑,也能让模块被导入时不会执行多余操作,是Python开发中非常实用的基础技巧。