在 python 中,__name__ 是一个内置变量,用于标识当前模块的名字。当模块被直接运行时,其 __name__ 值为 ‘__main__’,而被导入时则为模块名;1. 利用 if __name__ == ‘__main__’: 可控制代码仅在直接运行时执行,避免导入时触发副作用;2. 此机制适用于分离测试与功能代码、提供模块自检或示例代码、防止重复初始化资源、控制插件系统行为等场景,有助于提升代码的可维护性和结构清晰度。
在 Python 中,__name__ 是一个内置的特殊变量,它用来标识当前模块的名字。理解它的作用,尤其是在模块被导入时的行为,是写出结构清晰、可复用代码的重要基础。
__name__ 的基本含义
每个 Python 模块都有一个 __name__ 属性。当你运行一个脚本的时候,Python 解释器会自动为这个脚本设置 __name__ = ‘__main__’。而如果这个模块是被其他模块导入的,那么它的 __name__ 就会被设为模块的实际名称。
比如你有一个文件叫 my_module.py,如果你直接运行它,那里面的 print(__name__) 会输出 ‘__main__’;但如果你从另一个文件中导入它,比如 import my_module,这时候 my_module 里的 __name__ 就是 ‘my_module’。
利用 if __name__ == ‘__main__’: 控制执行逻辑
这是最常见也最有用的使用方式。通过判断 __name__ 的值,你可以决定哪些代码只在模块被直接运行时才执行,而在模块被导入时不执行。
立即学习“Python免费学习笔记(深入)”;
举个例子:
# my_script.py def main(): print("程序主逻辑") if __name__ == '__main__': main()
这样写的好处有:
- 保证模块可以作为独立脚本运行
- 同时也能被安全地导入到别的模块中而不触发不必要的副作用
这种写法特别适合写命令行工具或测试代码。很多初学者忽略这一点,导致在导入模块时意外执行了测试代码或启动逻辑。
模块导入时 __name__ 的行为变化
当一个模块被导入时,它的 __name__ 会被设为模块路径。例如:
- 导入 utils.py,则 __name__ 是 ‘utils’
- 如果模块位于包中,比如 package/utils.py,那 __name__ 会是 ‘package.utils’
这也意味着,你可以在模块内部根据其加载方式做一些不同的处理。比如打印日志时带上模块名,或者根据不同调用方式启用不同的配置。
实际开发中的几个常见用途
- 分离测试与功能代码:把测试代码放在 if __name__ == ‘__main__’: 块里,避免导入时运行。
- 模块自检或示例代码:提供一些简单的使用样例,方便调试和文档展示。
- 防止重复执行初始化逻辑:有些资源(如数据库连接)只需要初始化一次,用 __name__ 可以帮助判断是否已经加载过。
- 控制插件系统行为:某些框架会利用模块的 __name__ 来识别插件来源或注册路径。
基本上就这些。虽然 __name__ 看起来是个小细节,但在组织模块结构、避免副作用、提高可维护性方面,它其实很关键。不复杂但容易忽略。
评论(已关闭)
评论已关闭