90%工程师都说不明白的上下文管理器

DeepSeekAPI支持百万Token上下文:长程认知落地的关键突破 大模型长上下文能力是实现复杂任务推理与企业级知识处理的基础技术概念。其核心原理在于突破传统注意力机制的显存与延迟瓶颈,通过分块注意力、动态KV Cache压缩等工程优化,在精度、成本与实用性间取得平衡。该能力显著提升模型对长文档、多源数据的理解深度,支撑法律审查、金融合规、工业知识库等高价值场景。百万Token并非单纯参数升级,而是API服务端、客户端与开发者调用契约三者对齐的系统性进步,标志着大模型从单轮问答工具迈向可信赖的长程认知伙伴。DeepSeekAPI此次更新正是这一演进的关键实证。 阅读详情

我想你对 Python 中的with语句一定不陌生,尤其是在文件的读写操作中,不过我想,大部分人可能习惯了它的使用,却并不知道隐藏在其背后的“秘密”。

那么,究竟with语句要怎么用,与之相关的上下文管理器(context manager)是什么,它们之间又有着怎样的联系呢?这篇文章就为大家带来解密

什么是上下文处理器?

在任何一门编程语言中,文件的输入输出、数据库的连接断开等,都是很常见的资源管理操作。但资源都是有限的,在写程序时,我们必须保证这些资源在使用过后得到释放,不然就容易造成资源泄露,轻者使得系统处理缓慢,重则会使系统崩溃。

光说这些概念,你可能体会不到这一点,我们可以看看下面的例子:

for x in range(10000000):
    f = open('test.txt', 'w')
    f.write('hello')

这里我们一共打开了 10000000 个文件,但是用完以后都没有关闭它们,如果你运行该段代码,便会报错:

OSError: [Errno 23] Too many open files in system: 'test.txt'

 很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:609616831


这就是一个典型的资源泄露的例子。因为程序中同时打开了太多的文件,占据了太多的资源,造成系统崩溃。

为了解决这个问题,不同的编程语言都引入了不同的机制。而在 Python 中,对应的解决方式便是上下文管理器(context manager)。上下文管理器,能够帮助你自动分配并且释放资源,其中最典型的应用便是with语句。所以,上面代码的正确写法应该如下所示:

for x in range(10000000):
    with open('test.txt', 'w') as f:
        f.write('hello')

这样,我们每次打开文件“test.txt”,并写入‘hello’之后,这个文件便会自动关闭,相应的资源也可以得到释放,防止资源泄露。当然,with语句的代码,也可以用下面的形式表示:

f = open('test.txt', 'w')
try:
    f.write('hello')
finally:
    f.close()

要注意的是,最后的finally block尤其重要,哪怕在写入文件时发生错误异常,它也可以保证该文件最终被关闭。不过与with语句相比,这样的代码就显得冗余了,并且还容易漏写,因此我们一般更倾向于使用with语句。

另外一个典型的例子,是 Python 中的threading.lock 类。举个例子,比如我想要获取一个锁,执行相应的操作,完成后再释放,那么代码就可以写成下面这样:

some_lock = threading.Lock()
some_lock.acquire()
try:
    ...
finally:
    some_lock.release()

而对应的with语句,同样非常简洁:

some_lock = threading.Lock()
with somelock:
    ...

我们可以从这两个例子中看到,with 语句的使用,可以简化了代码,有效避免资源泄露的发生。

上下文管理器的实现

基于类的上下文管理器

了解了上下文管理的概念和优点后,下面我们就通过具体的例子,一起来看看上下文管理器的原理,搞清楚它的内部实现。这里,我自定义了一个上下文管理类 FileManager,模拟 Python 的打开、关闭文件操作:

class FileManager:
    def __init__(self, name, mode):
        print('calling __init__ method')
        self.name = name
        self.mode = mode
        self.file = None
        
    def __enter__(self):
        print('calling __enter__ method')
        self.file = open(self.name, self.mode)
        return self.file


    def __exit__(self, exc_type, exc_val, exc_tb):
        print('calling __exit__ method')
        if self.file:
            self.file.close()
            
with FileManager('test.txt', 'w') as f:
    print('ready to write to file')
    f.write('hello world')
    
## 输出
calling __init__ method
calling __enter__ method
ready to write to file
calling __exit__ method

需要注意的是,当我们用类来创建上下文管理器时,必须保证这个类包括方法”__enter__()”和方法“__exit__()”。其中,方法“__enter__()”返回需要被管理的资源,方法“__exit__()”里通常会存在一些释放、清理资源的操作,比如这个例子中的关闭文件等等。

而当我们用 with 语句,执行这个上下文管理器时:

with FileManager('test.txt', 'w') as f:
    f.write('hello world')

下面这四步操作会依次发生:

1.方法“__init__()”被调用,程序初始化对象FileManager,使得文件名(name)是"test.txt",文件模式 (mode) 是'w';

2.方法“__enter__()”被调用,文件“test.txt”以写入的模式被打开,并且返回 FileManager 对象赋予变量 f;

3.字符串“hello world”被写入文件“test.txt”;

4.方法“__exit__()”被调用,负责关闭之前打开的文件流。

因此,这个程序的输出是:

calling __init__ method
calling __enter__ method
ready to write to file
calling __exit__ meth

另外,值得一提的是,方法“__exit__()”中的参数“exc_type, exc_val, exc_tb”,分别表示 exception_type、exception_value和traceback。当我们执行含有上下文管理器的with语句时,如果有异常抛出,异常的信息就会包含在这三个变量中,传入方法“__exit__()”。

因此,如果你需要处理可能发生的异常,可以在“__exit__()”添加相应的代码,比如下面这样来写:

class Foo:
    def __init__(self):
        print('__init__ called')

    def __enter__(self):
        print('__enter__ called')
        return self
    def __exit__(self, exc_type, exc_value, exc_tb):
        print('__exit__ called')
        if exc_type:
            print(f'exc_type: {exc_type}')
            print(f'exc_value: {exc_value}')
            print(f'exc_traceback: {exc_tb}')
            print('exception handled')
        return True
    
with Foo() as obj:
    raise Exception('exception raised').with_traceback(None)

# 输出
__init__ called
__enter__ called
__exit__ called
exc_type: <class 'Exception'>
exc_value: exception raised
exc_traceback: <traceback object at 0x1046036c8>
exception handled

这里,我们在 with 语句中手动抛出了异常“exception raised”,你可以看到,“__exit__()”方法中异常,被顺利捕捉并进行了处理。不过需要注意的是,如果方法“__exit__()”没有返回 True,异常仍然会被抛出。因此,如果你确定异常已经被处理了,请在“__exit__()”的最后,加上“return True”这条语句。

基于生成器的上下文管理器

诚然,基于类的上下文管理器,在 Python 中应用广泛,也是我们经常看到的形式,不过 Python 中的上下文管理器并不局限于此。除了基于类,它还可以基于生成器实现。接下来我们来看一个例子。

比如,你可以使用装饰器 contextlib.contextmanager,来定义自己所需的基于生成器的上下文管理器,用以支持 with 语句。还是拿前面的类上下文管理器 FileManager 来说,我们也可以用下面形式来表示:

from contextlib import contextmanager

@contextmanager
def file_manager(name, mode):
    try:
        f = open(name, mode)
        yield f
    finally:
        f.close()
        
with file_manager('test.txt', 'w') as f:
    f.write('hello world')

这段代码中,函数 file_manager() 是一个生成器,当我们执行 with 语句时,便会打开文件,并返回文件对象 f;当 with语句执行完后,finally block中的关闭文件操作便会执行。

你可以看到,使用基于生成器的上下文管理器时,我们不再用定义“__enter__()”和“__exit__()”方法,但请务必加上装饰器 @contextmanager,这一点新手很容易疏忽。

讲完这两种不同原理的上下文管理器后,还需要强调的是,基于类的上下文管理器和基于生成器的上下文管理器,这两者在功能上是一致的。只不过

  • 基于类的上下文管理器更加 flexible,适用于大型的系统开发;
  • 而基于生成器的上下文管理器更加方便、简洁,适用于中小型程序。

在这里还是要推荐下我自己建的Python学习群:609616831,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2020最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

DeepSeek V4专家模式与百万token上下文实战指南 大语言模型的推理能力正从静态响应迈向动态思维链与长上下文协同演进。理解动态CoT(Chain-of-Thought)机制与百万级token上下文处理,是构建高可信AI应用的核心基础——前者决定模型能否分步归因、溯源验证,后者关乎知识检索精度与工程成本控制。DeepSeek V4通过稀疏激活架构、分段式KV缓存与子词级token计费,在保证专业深度的同时显著降低API实际开销。其专家模式并非简单增强版,而是面向开发者交付的可验证推理范式;百万token也非参数噱头,而是经存储优化、双通道检索与文本压缩验证的生 阅读详情

相关推荐

Qwen3-Coder:原生CLI编程助手与256K上下文系统建模

CLI编程工具是开发者日常高频使用的命令行交互载体,其核心价值在于低延迟、可脚本化与深度集成能力;而大模型的上下文长度已从早期的几千token演进至256K量级,但关键不在‘能读多长’,而在能否实现跨文件、跨模块的语义建模。Qwen3-Coder通过原生CLI设计、Trace MoE架构与CDRE图谱编码器,首次将高精度Agentic Coding能力嵌入POSIX终端环境,在不依赖网络、不侵入开发习惯的前提下,支撑代码修复、系统重构与自动化审计等工程场景。它代表了AI编程从‘提示词实验’走向‘基础设施化’

weixin_33805992的博客 319

文件读写

读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。 1.读...

Alie1129的博客 1217

腾讯IMA Copilot:面向工程师的知识库AI工作台

知识库AI是当前企业级AI落地的核心范式,其本质是将散落的文档、日志、会议记录等非结构化信息转化为可检索、可推理、可执行的知识资产。其技术原理依赖多模型协同(如混元与DeepSeek R1分工处理语义理解与结构化抽取),通过RLHF反馈闭环持续优化准确性,并依托权限体系与血缘图谱实现跨源事实对齐。相比传统代码补全类Copilot,它更聚焦于故障诊断、文档精读、跨系统联动等工程实践场景,尤其适配腾讯云生态下的真实研发环境——如乐固加固分析、COS配置迁移、腾讯会议Ubuntu兼容性排查等。本文深入解析IMA

weixin_30814329的博客 346

Python 中的 with open() as f:

1with open() as f 1.1 常见的读写操作 with open(r'filename.txt') as f: data_user=pd.read_csv(f) #文件的读操作 with open('data.txt', 'w') as f: f.write('hello world') #文件的写操作 相关参数: r: 以只读方式打开文件。文件的指针将会放在文件的开头。这是**默认模式**。 rb: 以二进制格式打开一个文件用于只读。文件指针将会放在文.

qq_41468616的博客 8954

STLink驱动无法识别?一文说清常见问题

遇到stlink驱动无法识别的问题别慌,本文详细梳理了安装失败、连接异常等高频故障,结合stlink驱动特性给出实用解决方案,帮你快速恢复调试环境。

weixin_32242475的博客 1189

STM32CubeProgrammer连接超时?STLink驱动深度剖析与修复指南

遇到STM32CubeProgrammer连接超时别慌,多数问题源于stlink驱动异常。深入分析驱动安装失败、版本不匹配等根源,并提供切实可行的修复步骤,彻底解决stlink驱动通信故障,提升开发效率。

weixin_36364707的博客 761

Python 文件读写

Python文件读写  Python内置了读写文件的函数,用法和C是兼容的。本节介绍内容大致有:文件的打开/关闭、文件对象、文件的读写等。  本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件读写,也需要注意编码问题;其他文件的读写及编码相关详见专题的博文。  open() close() with open(...) as ...    看以下示例...

weixin_33883178的博客 648

Claude Code深度解析:基于Bash/Git/工具链的上下文感知编程协作者

在AI编程助手泛滥的今天,真正理解开发者工作流的系统极为稀缺。Claude Code并非传统CLI工具,而是一个以Bash运行时为神经突触、Git仓库为记忆锚点、多工具协同为决策通路的上下文感知引擎。其核心原理在于实时劫持execve、readline等系统调用,结合git blame、curl证书链、文件字节偏移等多维信号构建动态上下文向量,并通过信任衰减、意图建模与空间定位实现精准生成。技术价值体现在对POSIX兼容性、环境确定性与安全水位的深度耦合——这解释了为何它在嵌入式Linux驱动组表现稳健,却

weixin_30709061的博客 410

with open as f用法_Python巧用上下文管理器和With语句精简代码

大家对Python中的with语句一定不陌生,尤其是在文件的输入输出操作中,不过我想,大部分人可能习惯了它的使用,却并不知道隐藏在其背后的“秘密”。那么,究竟with语句要怎么用,与之相关的上下文管理器(context manager)是什么,它们之间又有着怎样的联系呢?这节课,我就带你一起揭开它们的神秘面纱。什么是上下文管理器?在任何一门编程语言中,文件的输入输出、数据库的连接断开等,都是很常见...

weixin_39725403的博客 404

Multisim14使用教程:一文说清仿真环境配置要点

手把手带你完成Multisim14安装、元件库加载与电路仿真参数设置,避开常见报错和兼容性陷阱。结合实际案例讲解如何快速启动直流/交流/瞬态分析,让multisim14使用教程真正落地可操作。

weixin_33419305的博客 293

AI Agent故障预测引擎:事前预判40%可预防失败

AI Agent在生产环境中频繁出现幻觉、循环调用、上下文漂移等‘静默失效’,本质是运行时状态失控与决策不确定性激增所致。其核心原理在于对Agent内存状态、工具调用模式及语义推理熵值进行毫秒级感知与建模,将传统‘事后重试’容错升级为‘事前干预’范式。该技术显著提升系统可观测性与鲁棒性,尤其适用于LangChain等主流框架构建的金融、电商、SaaS客服类生产级Agent。本文聚焦Predictive Engine如何通过状态快照、语义熵分析与柔性干预三层架构,实现对上下文漂移和工具调用死锁等典型故障的精准

aiman5818的博客 455

python语法学习第七天--文件

打开文件:open() 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 参数说明: 1、file: 必需,文件...

qq_44711190的博客 658

oracle ebs form 10g安装教程

这个窗口需要想想,你要安装的类型,不要盲目点击“下一步”,因为一旦Oracle安装后,重新安装之前,需要卸载Oracle干净才能重新安装,有时还会出现错误。到了该窗口后,需要耐心等待安装,安装到一大半后,自动弹出一个窗口,让我们选择Oracle安装第2部分磁盘的路径,继续安装,然后坐等安装结束。自定义安装Oracle根目录,点击“下一步”按钮后,耐心等待几秒钟,工具自动加载产品列表,加载完后,自动跳转到“选择安装类型”窗口。注:等待几秒钟后,关闭dos窗口,不必惊慌,自动调转到安装界面。

XIELIUHAI001的博客 475

用AutoGen Studio省钱妙招:按需付费,比自建省90%

本文介绍了基于星图GPU平台,如何通过预装镜像自动化部署AutoGen Studio,实现零代码构建多智能体AI工作流。该方案支持按需付费,显著降低算力成本,典型应用于快速开发旅游规划、模型微调等AI项目,助力小团队高效完成客户交付。

EmeraldTiger56的博客 425

Opencv相机校准之棋盘格标定

Reference: https://yq.aliyun.com/articles/62472

y459541195的博客 3万+

记录一下本地部署Dify的坑

1. 截止2025-3-4为止,请注意,不要直接拉Dify的1.0.0版本。请先试用0.15.3版本。1.0.0有一个bug需要解决。3. 请使用docker-ce 新版本,docker-engine等老版本可能会有部分容器启动脚本执行莫名报错。2. 注意,请使用docker-compose V2版本,或者V1较高版本,否则会导致解析官方yml模板错误。

哈利路亚的收藏夹 5348

IQuest-Coder-V1 vs Claude 3对比:LiveCodeBench v6性能评测

本文介绍了如何在星图GPU平台上自动化部署IQuest-Coder-V1-40B-Instruct镜像,该模型专为高可靠性代码生成设计,可直接应用于算法题求解、生产级API开发及遗留系统调试等典型工程场景,显著提升开发者首次生成即通过率与代码可审计性。

weixin_42600128的博客 1059

基于大模型的恶性胸腔积液全周期预测与诊疗方案研究

本研究基于大模型技术构建了恶性胸腔积液全流程预测与诊疗体系,涵盖术前风险评估、术中方案优化、术后恢复预测及并发症预防。通过整合多源医疗数据,实现了手术风险概率预测(准确率80%)、并发症预警(AUC值0.85)及个性化康复方案制定,显著提升诊疗精准度。研究创新性地将Transformer架构与多模态数据融合,在100例临床验证中显示良好性能,但存在数据样本局限、模型可解释性不足等问题。未来将扩大多中心临床验证,优化算法可解释性,探索与基因检测等技术的结合应用,推动恶性胸腔积液的精准诊疗发展。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1901

全干工程师实战指南:用JMeter录制与优化性能测试脚本

性能测试是软件质量保障的关键环节,它通过模拟真实用户并发访问,评估系统在高负载下的响应时间、吞吐量和稳定性。其核心原理是利用工具生成虚拟用户,发送请求并收集指标,从而发现系统瓶颈。对于全栈或全干工程师而言,掌握性能测试技术能有效保障应用上线后的可靠性,避免生产环境崩溃。Apache JMeter作为一款开源的性能测试工具,凭借其**录制功能**和灵活的脚本定制能力,可以快速构建贴近真实场景的测试脚本。通过**参数化**和**断言**等元件,工程师能轻松模拟多样化的用户行为并验证系统响应,将性能验证无缝集成到

weixin_34265814的博客 376

VS2015+C++实战:手把手教你用海康MVS里的Demo搞定多相机同步采图与保存

本文详细解析了在VS2015+C++环境下,利用海康威视MVS工业相机SDK实现多相机同步采图与保存的全流程。从环境准备、SDK选择到多相机初始化、同步采图方案,再到异常处理与性能优化,提供了实战技巧和代码示例,帮助开发者快速掌握工业相机二次开发的核心技术。

weixin_29170327的博客 283

《遥感大模型生产级实战:从数据到决策的端到端AI工程》系列第一部分:AI遥感工程师的基础设施与工具链-文章 4:传统遥感分析与机器学习基线

本章将系统性地介绍经典遥感分析工作流,从数据预处理到多维度特征工程,再到如何利用经典的机器学习模型(如随机森林、支持向量机)进行监督与非监督学习。我们将通过一个完整的“智慧农业作物分类”项目实战,展示如何利用我们之前构建的数据湖和工具链,从原始数据到最终的分析结果,构建一个性能可靠、可解释性强的基线系统。更重要的是,我们将深入剖析这种传统方法的局限性,从而为后续章节引入遥感大模型的必要性提供强有力的论证。

panshengwu的博客 707

避坑指南:VMware扩展Ubuntu磁盘时90%人会遇到的3个隐藏问题(附解决方案)

本文深入剖析了在VMware中为Ubuntu虚拟机扩展磁盘时,90%用户可能遇到的三个隐蔽问题:虚拟机状态陷阱、GParted安装依赖错误以及MBR/GPT分区表兼容性危机。文章不仅揭示了问题根源,还提供了从完全关闭虚拟机、修复APT源到安全调整分区的完整解决方案,帮助运维人员和开发者高效、安全地完成磁盘扩容。

g9h0i1的博客 824

【调试记录】GT ip跑aurora 64b66b协议

如果不用,会出现这种情况:自回环测试,数据收发ok.一旦和对方通信,对方接收的就是一堆乱码,因为GT链路发送数据不能是全1或全0,或者长时间的1或0.否则线路容易受到干扰,毕竟线速率10多G,用了加扰和解扰,就可以提高抗干扰能力。64B66B编码,数据输入是64bit,输出是66bit,所以这之间存在着2bit的带宽差,Gearbox 就是用来解决这种差异的,实现方式是:将66bit数据拿出来2bit先存入Gearbox,然后输出64bit.发送同步码或控制数据时,配置成2.2.4 加扰和解扰!

weixin_41246509的博客 1607

通义灵码:面向工程上下文的AI编程协作者

AI编程工具正从局部代码补全迈向工程级语义理解。其核心原理在于融合IDE抽象语法树(AST)、项目配置元数据与大模型推理能力,实现对技术栈、编码规范和业务语义的深度感知。这种‘本地采集+云端推理’的协同架构,既保障响应效率,又支撑复杂场景下的精准生成,显著提升中高级开发者在Spring Boot、微服务、遗留系统改造等真实工程中的生产力。相比教学型AI或纯离线方案,它更强调无缝嵌入日常开发流——如通义灵码vscode与通义灵码idea插件所体现的IDE深度集成能力,让AI真正成为可信赖的‘键盘旁协作者’。

dengwan3818的博客 506

对工时评估的思考:当AI颠覆了coding效率

在AI时代,“人日”作为软件工时度量衡已然失效。开发的价值核心正从“编码实现”转向“深度思考”与“精准沟通”——即如何将人类的模糊需求精确地传达给AI。当最有价值的“思想工作”变得最难量化时,传统的项目管理范式随之动摇。我们必须超越对过程的算计,开始探索衡量思想、沟通与业务价值的新标尺。

架构师刘7的博客 1017

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

工程师桌面效率神器:WallCal3透明日历的配置、美化与嵌入式开发实战

在软件开发和项目管理中,桌面信息管理是提升个人效率的关键环节。其核心原理在于通过视觉化手段,将关键信息置于用户的无干扰视野内,降低任务切换的认知成本,实现工作流的无缝衔接。这项技术的价值在于它能将抽象的时间线和待办事项转化为持续存在的环境提示,尤其适合需要高度专注又需兼顾多任务并行的技术工作者。典型的应用场景包括嵌入式开发的项目里程碑跟踪、硬件研发的节点管理以及日常灵感的快速记录。本文聚焦于WallCal3这款经典的桌面日历工具,它利用透明合成技术将日程‘烙’在壁纸上,解决了工程师在复杂开发环境下的‘视觉提

weixin_30326515的博客 518

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 用Python给人物P上墨镜烟斗特效
下一篇: Python一键搞定批量合成PDF
python阿喵
博客等级 码龄6年 169粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值