当前位置: 首页 > news >正文

21 python __name__ 与 __main__

在办公室里,每个员工都有自己的工牌,上面写着姓名和部门。

一、__name__:模块的名字

Python 模块也有类似的 "工牌"——__name__属性,它记录了模块的身份:

  • 直接运行时 → __name__ = "__main__"(相当于员工独立工作时的身份)
  • 被其他模块导入时 → __name__ = "模块名"(相当于员工被借调到其他部门时的身份)

二、__main__:独立工作的标志 

当模块作为主程序运行时,Python 会将__name__设为"__main__",这相当于员工在自己的工位独立完成任务。

在前面我们会编写自己的模块和包,但是要测试这个模块和包,又需要再编写一个py文件,有没有办法我在模块里就进行测试了呢,这就要提到__main__了。

比如我在前面写的自定义模块里运行,是没有任何执行的,但是我将document_utils.py改成下面的样子:

def print_document(doc_name):
    print(f"正在打印文档: {doc_name}")
    
def main():
    print_document("report.docx")
    
if __name__ == '__main__':
    main()

当我们在该模块运行时,会调用main函数,而在外部进行导入时就不会调用main函数,这样,我们就可以在我们的模块里测试我们的功能函数。

我们还可以修改成这样,当外部调用时会有提示。

def print_document(doc_name):
    print(f"正在打印文档: {doc_name}")

def main():
    print_document("report.docx")

if __name__ == '__main__':
    main()
else:
    print("模块document_utils已被加载...")

三、为什么需要双重身份

  1. 代码复用 → 模块可以同时作为工具库和独立脚本
  2. 测试方便 → 开发时直接运行测试,集成时隐藏测试代码
  3. 职责分离 → 独立逻辑与工具函数分开,避免混乱

四、最佳实践:模块开发规范

所有可执行代码放入if __name__ == "__main__"
避免模块被导入时意外执行代码。

测试代码与业务逻辑分离

def 生成报表():
    # 业务逻辑
    pass

if __name__ == "__main__":
    生成报表()  # 仅独立运行时生成报表

添加初始化提示

if __name__ == "__main__":
    print("开始独立执行报表生成")
else:
    print("报表模块已导入,可随时调用")

五、常见问题解答

  1. 如果模块没有if __name__块?
    → 所有代码在导入时都会执行(类似员工被借调时还在做自己的事)

  2. 可以有多个if __name__块吗?
    → 可以,但建议集中管理,避免代码分散

  3. 如何调试被导入的模块?
    → 在else块中添加调试代码,或使用日志工具

http://www.dtcms.com/a/99717.html

相关文章:

  • Java中的String类
  • 智能巡检机器人:2025年企业安全运维的“数字哨兵“
  • Vue 3 中 slot插槽的使用方法
  • 最大子序和 买股票的最佳时机|| 跳跃游戏
  • 【计算机网络】深入解析TCP/IP参考模型:从四层架构到数据封装,全面对比OSI
  • 面经-项目
  • 革新测试管理 2.0丨Storm UTP统一测试管理平台智能化升级与全流程优化
  • HCIP之VRRP
  • 晶晨S905L3A(B)-安卓9.0-开启ADB和ROOT-支持IPTV6-支持外置游戏系统-支持多种无线芯片-支持救砖-完美通刷线刷固件包
  • memtest86检测内存
  • Anaconda Jupyter 默认启动位置修改
  • 矩阵中对角线的遍历问题【C++】
  • JavaScript运算符与逻辑中断
  • 从零到前沿:2025年人工智能系统性学习路径与最新技术融合指南
  • LangChain 基础系列之文档加载与分割详解:从非结构化数据到知识图谱的关键一步
  • ubuntu24 部署vnc server 使用VNC Viewer连接
  • vLLM 实现加速的原理及举例; vLLM 与 TensorRT 的区别
  • C#里使用C#语言作为脚本运行的方法
  • HarmonyOS NEXT——鸿蒙神策埋点(二)
  • 了解遗传算法的Matlab程序的奥妙之处
  • 【记录自己第一个github 100星项目】采用flask框架构建一个前端页面,进行OpenManus的调用,对OpenManus生成的文件进行预览。
  • 使用Python的pytesseract进行网站模拟登录的脚本,主要针对古诗文网(gushiwen.cn)的登录功能。
  • 第十四届蓝桥杯真题(PWM输出)
  • 【Java/数据结构】二叉树(BinaryTree)(图文版)
  • Ubuntu 系统中安装 Nginx
  • 【study】嵌入式软件工程师学习规划
  • The selected directory is not a valid home for Go SDK
  • [C++] STL - string部分函数小合集
  • 晋升系列6:专项提升
  • PHP 包含:深入理解与最佳实践