深入理解Python的With-as语句

Python 之进阶语法:with...as... 是从Python2.5引入的一个新的语法,它是一种上下文管理协议,目的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关代码统统去掉,简化try...except...finlally的处理流程。我们发现,一旦跳入了某条except语句,就会执行相应的异常处理方法(block),执行完毕就会结束。–>发现B错误,开始寻找匹配B的异常处理方法,发现A,跳过,发现except others(即except:),执行exc other block。所谓的表达式,就是错误的定义。 阅读详情

学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭。比如:我想把一些对象序列化到文件里面,然后当我再次使用的时候,在从文件里面读取反序列化成对象。像这种操作一般都是用try…except…finally。但是经过自己对Python的研究发现会有更出色的方法,比如:with-as语句也有的人称为context manager。

With-as 用法

我们先看一下例子,当我们需要打开一个文件的时,比如:txt等,一般经常会这么操作:

try:
    f = file.open('test.txt','rw')
    To Do
except:
    To Do
finally:
    f.close()

这是错误,因为file.open是否打开文件是不确定,而在出现异常的时候你却关闭了已经打开的文件。文件没有打开怎么能直接关闭呢?你可以按照下面的解决方法来解决上述出现的问题。

try:  
    f = file.open('test.txt','rw')
    To Do
except:  
    To Do
    //出现异常直接返回或者退出,这说明file并没有打开。
    return/exit(-1) 

//已经成功打开file文件,所以你需要在finally中关闭打开的文件。
try:  
    To Do
except:  
    To Do
finally:  
    f.close()

你会发现这么做会非常麻烦,并且try……except…..finally嵌套也比较啰嗦。那有没有好的解决办法能解决上述问题,并且还能减少代码量呢?(类似于C#中的using关键字)答案是肯定的,那就是with……as语句。With语句适用于对I/O、文件流、数据流等资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源.比如文件使用后自动关闭、线程中锁的自动获取和释放等等。 我们来看一下with-as的用法:

with open('/etc/passwd', 'r') as f:  
    for line in f:
        print line
        ... more processing code ...

这个语句执行完成之后,不管在处理文件过程中是否发生异常,都能保证 with 语句执行完毕后已经关闭了打开的文件句柄,确实比try……except……finally好多了。在这个例子中f就是上下文管理器enter()的返回值,返回的是当前文件自身的引用。Python内建对象都加入了对上下文管理器的支持,可以用在with语句中。比如:file、 threading、decimal等等,在多线程模块中,lock和条件变量也是支持with语句的。例如:

lock = threading.Lock()  
with lock:  
    # Critical section of code
    ...

在代码执行之前lock总是先获得,只要block代码完成lock就会被释放。要想彻底了解Python的With-As语句,请继续往下看。

Python术语

Context Management Protocol(上下文管理协议):包含方法__enter()__和__exit()__,支持该协议的对象要实现这两个方法。上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter()__ 和__exit()__ 方法。上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通常使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。

context_manager = context_expression  
exit = type(context_manager).__exit__  
value = type(context_manager).__enter__(context_manager)
# True 表示正常执行,即便有异常也忽略;False 表示重新抛出异常,需要对异常进行处理.
exc = True  

try:
    target = value  # 如果使用了 as 子句
    with-body     # 执行 with-body
except:
    # 执行过程中有异常发生
    exc = False
    # 如果 __exit__ 返回 True,则异常被忽略;如果返回 False,则重新抛出异常
    # 由外层代码对异常进行处理
    if not exit(context_manager, *sys.exc_info()):
        raise
finally:
    # 正常退出,或者通过 statement-body 中的 break/continue/return 语句退出
    # 或者忽略异常退出
    if exc:
        exit(context_manager, None, None, None) 
    # 缺省返回 None,None 在布尔上下文中看做是 False

上下文管理协议

with表达式执行生成一个叫做上下文管理器的对象,上下文管理器必须包含enter()和exit()方法,并且要实现该两个方法。 上下文管理器的enter()方法被调用,返回值将赋值给var,如果没有as var,则返回值被丢弃。 执行With-Body语句体。 不管是否执行过程中是否发生了异常,执行上下文管理器的 exit() 方法,exit() 方法负责执行“clean-up”工作,如释放资源等。如果执行过程中没有出现异常,或者语句体中执行了语句( break/continue/return),则以 None 作为参数调用 exit(None, None, None) ;如果执行过程中出现异常,则使用 sys.excinfo 得到的异常信息为参数调用 exit(exctype, excvalue, exctraceback),通常返回值是一个tuple, (type, value/message, traceback)。 出现异常时,如果 exit(type, value, traceback) 返回 False,则会重新抛出异常,让with 之外的语句逻辑来处理异常,这也是通用做法;如果返回 True,则忽略异常,不再对异常进行处理。 运行时上下文(runtime context):通过上下文管理器创建,并由上下文管理器的 enter() 和exit() 方法实现,enter() 方法在语句体执行之前进入运行时上下文,exit() 在语句体执行完后从运行时上下文退出。返回一个布尔值表示是否对发生的异常进行处理。如果退出时没有发生异常,则3个参数都为(None,None,None)。如果发生异常,返回True :不处理异常,否则会在退出该方法后重新抛出异常以由 with 语句之外的代码进行处理。如果该方法内部产生异常,不能重新抛出通过参数传递进来的异常,只需要return False 就可以。之后,上下文管理代码会检测是否 exit() 失败来捕获和处理异常。

#-*- coding: utf-8 -*-

class Cursor(object):  
    def execute(self,msg):
        print msg

class DatabaseConnection(object):  
    def commit(self):
        print "Commits current transaction"
    def rollback(self):
        print "Rolls back current transaction"
    def __enter__(self):
        print "Go into __enter__()"
        cursor = Cursor()
        return cursor
    def __exit__(self,exc_type,exc_value,exc_tb):
        print "Go into __exit__()"
        #raise Exception("__exit__......Exception")
        if exc_tb is None:
            #如果没有异常,则提交事务
            print "Exited Without Exception"
            self.commit()
        else:
            #如果有异常,则回滚
            print "Exited with exception raised"
            print "type:[",exc_type,"],value:[",exc_value,"],exc_tb:[",exc_tb,"]"
            self.rollback()

if __name__=="__main__":  
    db_connection = DatabaseConnection()
    with db_connection as cursor:
        cursor.execute("insert into......")
        cursor.execute("delete from......")

代码运行效果如下:

Go into __enter__()  
insert into......  
delete from......  
Go into __exit__()  
Exited Without Exception  
Commits current transaction

上述代码正好验证了我们之前的分析,当运行with dbconnection运行时,进入我们自定义的__enter()__方法,当执行完with包裹的代码块时,就会进入__exit()__方法,如果没有异常(通过exctb是否为None来判断,当然也可以用其他两个参数判断。)则执行相应的代码逻辑。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

class Cursor(object):  
    def execute(self,msg):
        print msg

class DatabaseConnection(object):  
    def commit(self):
        print "Commits current transaction"
    def rollback(self):
        print "Rolls back current transaction"
    def __enter__(self):
        print "Go into __enter__()"
        cursor = Cursor()
        return cursor
    def __exit__(self,exc_type,exc_value,exc_tb):
        print "Go into __exit__()"
        #raise Exception("__exit__......Exception")
        if exc_tb is None:
            #如果没有异常,则提交事务
            print "Exited Without Exception"
            self.commit()
        else:
            #如果有异常,则回滚
            print "Exited With Exception raised"
            print "type:[",exc_type,"],value:[",exc_value,"],exc_tb:[",exc_tb,"]"
            self.rollback()

if __name__=="__main__":  
    db_connection = DatabaseConnection()
    with db_connection as cursor:
        cursor.execute("insert into......")
        raise Exception("raise exception")
        cursor.execute("delete from......")

该代码示例中,我在with包裹的代码块中造成一个异常。我们来看一下效果:

Go into __enter__()  
insert into......  
Go into __exit__()  
Exited With Exception raised  
type:[ <type 'exceptions.Exception'> ],value:[ raise exception ],exc_tb:[ <traceback object at 0x0252A878> ]  
Rolls back current transaction  
Traceback (most recent call last):  
  File "D:\Test\DatabaseConnection.py", line 34, in <module>
    raise Exception("raise exception")
Exception: raise exception

当with包裹的代码块一旦出现异常,则进入exit()方法内,并根据该方法的参数全不为None。如果你在exit方法内你不手动返回一个值的话,则默认返回False。如果你返回True,则不会捕捉该异常,即使你在with代码块最外面包裹一个try……except…finally也不会捕捉到该异常,如果返回False则with之外的try–except也能捕捉到。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys

class Cursor(object):  
    def execute(self,msg):
        print msg

class DatabaseConnection(object):  
    def commit(self):
        print "Commits current transaction"
    def rollback(self):
        print "Rolls back current transaction"
    def __enter__(self):
        print "Go into __enter__()"
        cursor = Cursor()
        return cursor
    def __exit__(self,exc_type,exc_value,exc_tb):
        print "Go into __exit__()"
        #raise Exception("__exit__......Exception")
        if exc_tb is None:
            #如果没有异常,则提交事务
            print "Exited Without Exception"
            self.commit()
        else:
            #如果有异常,则回滚
            print "Exited With Exception raised"
            print "type:[",exc_type,"],value:[",exc_value,"],exc_tb:[",exc_tb,"]"
            self.rollback()
        return True

if __name__=="__main__":  
    db_connection = DatabaseConnection()
    try:
        with db_connection as cursor:
            cursor.execute("insert into......")
            raise Exception("raise exception")
            cursor.execute("delete from......")
    except:
        print"包裹with语句的try ",sys.exc_info()

运行效果如下:

Go into __enter__()  
insert into......  
Go into __exit__()  
Exited With Exception raised  
type:[ <type 'exceptions.Exception'> ],value:[ raise exception ],exc_tb:[ <traceback object at 0x0252A878> ]  
Rolls back current transaction

基本上Python的常用的用法我就了解这么多,至于代码希望你动手试一下你也能了解Python with语句的原理.

The contextlib module

contextlib模块支持一些函数和装饰器,比如:装饰器 contextmanager、函数 nested 和上下文管理器closing。使用这些对象,可以对已有的生成器(yield)函数或者对象进行包装,加入对上下文管理协议的支持,这样可以避免专门编写上下文管理器来支持 with 语句。

contextmanager

contextmanager 用于对生成器(yield)函数进行装饰,生成器(yield)函数被装饰以后,返回的是一个ContextManager(上下文管理器),其 __enter()__ 和 __exit()__ 方法由 contextmanager 负责提供,而不是之前通过一个上下文管理器重写这两个方法了。被装饰的函数只能产生一个值,否则会导致异常 RuntimeError;并且会把yield的值赋值给as后面的变量。看一下例子:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys  
from contextlib import contextmanager

class Cursor(object):  
    def execute(self,msg):
        print msg

class DatabaseConnection(object):  
    def cursor(self):
        print "Create a instance of Cursor"
        return Cursor()
    def commit(self):
        print "Commits current transaction"
    def rollback(self):
        print "Rolls back current transaction"


@contextmanager
def db_transaction(connection):  
    cursor = connection.cursor()
    try:
        print "yeild 执行之前......"
        yield cursor
        print "yeild 执行之后......"
    except:
        print "db_transaction raise exception"
        connection.rollback()
    else:
        print"Existed without exception"
        connection.commit()

if __name__=="__main__":  
    db_connection = DatabaseConnection()
    try:
        with db_transaction(db_connection) as cursor:
            cursor.execute("insert into......")
            #raise Exception("raise exception")
            cursor.execute("delete from......")
    except:
        print sys.exc_info()

运行结果如下:

Create a instance of Cursor  
yeild 执行之前......  
insert into......  
delete from......  
yeild 执行之后......  
Existed without exception  
Commits current transaction

通过上述运行结果,可以看出,生成器函数中 yield 之前的语句在 enter() 方法中执行,yield 之后的语句在__exit()__ 中执行,而 yield 产生的值赋给了 as 后面的 变量。这个contextmanager修饰器 只是省略了 __enter()__ / __exit()__ 的编写,但并不负责实现“获取资源”和“清理资源”工作;“获取资源”操作需要定义在 yield 语句之前,“清理资源”操作需要定义 yield 语句之后,这样 with 语句在执行__enter()__ / __exit()__ 方法时会执行这些语句以获取/释放资源,即生成器函数中需要实现必要的逻辑控制,包括资源访问出现错误时抛出适当的异常。 nested(mgr1, mgr2, …)() contextlib模块也有个nested(mgr1, mgr2, …)()函数,这个函数可以作用在多个上下文管理器。例如下面的例子with 语句不仅开启一个transaction也获得了一个线程锁,让当前操作不被其他线程干扰。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys  
from contextlib import contextmanager,nested,closing  
import threading

class Cursor(object):  
    def execute(self,msg):
        print msg

class DatabaseConnection(object):  
    def cursor(self):
        print "Create a instance of Cursor"
        return Cursor()
    def commit(self):
        print "Commits current transaction"
    def rollback(self):
        print "Rolls back current transaction"


@contextmanager
def db_transaction(connection):  
    cursor = connection.cursor()
    try:
        print "yeild 执行之前......"
        yield cursor
        print "yeild 执行之后......"
    except:
        print "db_transaction raise exception"
        connection.rollback()
    else:
        print"Existed without exception"
        connection.commit()

if __name__=="__main__":  
    db_connection = DatabaseConnection()
    lock = threading.Lock()
    with nested(db_transaction(db_connection),lock) as (cursor,locked):
        cursor.execute("insert into......")
        cursor.execute("delete from......")
运行结果如下:

Create a instance of Cursor  
yeild 执行之前......  
insert into......  
delete from......  
yeild 执行之后......  
Existed without exception  
Commits current transaction

closing(object)()方法返回一个对象可以绑定到as后面的变量,保证了打开的对象在 with-body(with包裹的代码) 执行完后会关闭掉。closing 上下文管理器包装起来的对象必须提供 close() 方法的定义,否则执行时会报错误。closing 适用于提供了 close() 实现的对象,比如:网络连接、数据库连接有非常的用武之地,也可以在自定义类时通过接口 close() 来执行所需要的资源“清理”工作。当然上述的这些操作你完全可以按照自己的逻辑去执行。请看如下代码:

import urllib, sys  
from contextlib import closing

with closing(urllib.urlopen('http://www.yahoo.com')) as f:  
    for line in f:
        sys.stdout.write(line)

基本上python的With语句的理解到此结束。希望本文对你有用,如有用请推荐。

参考文献

 

原文来源:https://cloud.tencent.com/developer/article/1083148

100个Python代码大全:学完这篇从Python小白到架构师 Python是一种广泛使用的高级编程语言,以其简洁优雅、易于学习和强大的库而闻名。无论你是一位经验丰富的程序员还是初学者,都可以从这种语言的丰富资源中受益。在本篇博客中,我将分享100个实用的Python代码示例,旨在帮助你掌握Python编程,并在日常工作中提高效率。 阅读详情

相关推荐

WinForm轻松打造AntDesign现代化工具栏

摘要: 本文介绍如何在WinForm中利用AntdUI库实现AntDesign风格工具栏,包括安装配置、动态生成按钮/下拉菜单、布局优化及主题美化。通过AntButton、AntDropdown等控件结合事件绑定,可快速构建支持图标、工具提示、权限控制的现代化工具栏,并解决常见图标加载、布局错乱问题。最后提供代码示例与响应式设计技巧,助你打造高效美观的WinForm界面。 (字数:150)

java专栏 1590

python with as用法详解

任何一门编程语言中,文件的输入输出、数据库的连接断开等,都是很常见的资源管理操作。但资源都是有限的,在写程序时,必须保证这些资源在使用过后得到释放,不然就容易造成资源泄露,轻者使得系统处理缓慢,严重时会使系统崩溃。 例如,前面在介绍文件操作时,一直强调打开的文件最后一定要关闭,否则会程序的运行造成意想不到的隐患。但是,即便使用 close() 做好了关闭文件的操作,如果在打开文件或文件操作过程中抛出了异常,还是无法及时关闭文件。 为了更好地避免此类问题,不同的编程语言都引入了不同的机制。在python中..

tecoes的博客 1万+

手把手教你用SNAP做全极化SAR图像分类

引言 最近在研究极化SAR图像分类方面的内容,发现用SNAP软件可以很方便的实现图像的分类。因为在入门过程中踩了很多坑,浪费了一些时间,为了不让大家踩坑,所以决定写下这篇教程。 前期准备 软件下载 SNAP是欧空局旗下的一个SAR图像处理软件,可以点击下载地址进行下载。 数据下载 数据下载地址:https://mdacorporation.com/sample_data/RS2_OK76385_...

zz651044657的博客 1万+

Python 进阶语法:with...as...

语句,就像一个贴心的管家,负责照顾你的资源,让你不再担心忘记关闭文件、网络连接或数据库事务等。封装是一个支持代码重用的好办法,但是这个办法很dirty,特别是当do something中有修改一些local variables(局部变量)的时候(变成函数调用,少不了带来变量作用域上的麻烦)。锁,资源请求,最终都有一个释放的需求。Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

2401_84204034的博客 7635

蓝桥杯FPGA赛道积分赛

代码如下: 按键驱动 代码如下 按键驱动 代码如下: 顶层文件 按键驱动 数码管驱动 声明:本代码借鉴网络资料,如有侵权和错误请联系作者删除。我是从寒假开始备赛的,由于我基础不行,备赛过程中也是混混呃呃的,备赛效率不高,总体来说备赛不认真,有点拖拉,但是最后我也坚持备赛到了今天,在备赛过程中,即复习了旧的东西,也学到了新的东西,总结起来还是有点收获的,后天北京、天津、河北地区就要进行省赛了,我会全力以赴,不管结果怎么样,尽力就好,最后祝大家都能

weixin_69804913的博客 1983

Claude skill-creator插件深度解析:从创建到优化的完整技能工程化体系

摘要:skill-creator是Anthropic推出的Claude技能开发插件,提供从创建到优化的全流程工程化支持。其核心架构采用渐进式披露机制和多Agent协作模式,包含Grader、Analyzer等专业评估组件。该插件支持自动化评测系统,通过测试用例管理、并行执行和结果聚合实现技能验证;提供迭代优化算法,基于数据驱动改进技能性能。典型应用场景包括标准化技能开发、自动化测试验证和触发优化,显著降低开发门槛并提升技能质量。

虚心若愚 988

python 之 with-as

python with-as

Dayu_log的博客 5792

mac(apple silicon)arm64安装spm12详细教程

3.下载matlab runtime R2023b for macOS (macA64),注意必须下载这个,只下载matlab是不可以的。默认安装目录是/Applications/MATLAB/MATLAB_Runtime/R2023b。注意最后的命令,路径根据自己的matlab_runtime安装位置进行调整,然后就可以安装成功了。5. 解压spm12.zip,解压后将文件夹拖到应用程序下(Applications)2.下载spm12,这个版本可兼容mac芯片!6.打开mac终端,输入。

weixin_62332001的博客 2020

大模型测试人员完整学习体系(分层成长路线 + 知识框架 + 落地实操)

本文系统构建了大模型测试工程师的4级能力成长体系:L1(测试执行)-L2(专项测试)-L3(质量体系)-L4(行业标准),详细拆解了每个阶段的核心技能图谱。重点包括:入门层需掌握传统测试基础和大模型产品逻辑;进阶层需精通Prompt用例设计、RAG测试、安全对齐、自动化评测等专项能力;高级层聚焦评测平台搭建与质量体系建设;专家层深入算法对齐与行业标准制定。文章配套提供了分阶段技术工具栈、3-12个月学习路径及5类实战项目建议,形成了一套完整的大模型测试人才能力培养框架。

SmallBull的博客 455

五十天精通硬件设计第6天-放大器知识及选型

运算放大器(Operational Amplifier,简称运放)是一种高增益的直流耦合差分放大器,广泛应用于信号处理、滤波、比较、积分、微分等电路中。

whm128的博客 593

python中异常和错误是一个概念_Python错误和异常概念

Python错误和异常概念(总)1. 错误和异常的处理方式常见的错误a:NameErrorif True:SyntaxErrorf = oepn('1.txt'):IOError10/0:ZeropisionErrora = int('d'):ValueError程序运行中断:KeyboardInterrupt2.Python-使用try_except处理异常(1)try:try_suiteexc...

weixin_39669202的博客 98

Linux内核驱动模型--PCIe(PCI Express)驱动​​

本文系统介绍了Linux内核中PCIe驱动的设计与实现。首先从架构定位入手,指出PCIe驱动基于PCI子系统扩展支持高速、低功耗特性。核心数据结构struct pci_driver包含设备匹配表id_table、生命周期函数probe/remove等关键组件。文章详细解析了驱动与设备的绑定流程、资源管理机制,并重点阐述了MSI-X中断、电源管理、热插拔和多队列等高级特性实现方案。最后提供了lspci、dmesg等调试工具的使用方法,总结了PCIe驱动在支持高性能设备中的关键作用。全文通过架构设计、核心结构、

amy_mhd的博客 425

python 模型 结果 十段_Python十段经典代码

Python 语法的精妙之处就体现在下面10个例子中。for - else十大装B语法,for-else 绝对算得上囊波湾!不信,请看:>>> for i in [1,2,3,4]:print(i)else:print(i, '我是else')12344 我是elseelse 的眼里只有 for,只要 for 顺利执行完毕,else 就会屁颠儿屁颠儿地跑一遍:>>&g...

weixin_32103009的博客 156

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Python十大装B语法

Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才是原配吗?No,你可能不...

edward_zcl的博客 231

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python-深入理解with语句

使用实例: with open('./data.txt') as file: file.read() 基本思想:with所求值的对象必须有__enter__方法和__exit__方法 基本流程:with后面的语句被求值后,enter方法被调用,返回一个对象赋予as后的变量,with模块中所有的语句被执行完毕后,调用前面返回对象的exit方法 In [4]: class Sam...

Data _designer 1608

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Python 中 with 用法详解

Python中with用法详解:https://www.cnblogs.com/pythonbao/p/11211347.html 1.with 语句的原理 上下文管理协议(Context Management Protocol):包含方法 __enter__() 和 __exit__(),支持该协议的对象要实现这两个方法。 上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了 __enter__() 和 __exit__() 方法。上下文管理器...

freeking101的博客 3万+

深入理解 Python 之 with 语句

浅谈 Python 的 with 语句 深入理解 Python 王生辉, 李骅宸 发布: 2011-12-02 引言 with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from future import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What’s new in Python 2.6? 中 with 语句相关部分介绍)。 with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发.

u014546828的博客 423

python语句解释_深入理解python with 语句

深入理解python with 语句python中with 语句作为try/finally 编码范式的一种替代, 适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的”清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等1. 使用with打开文件你应该见过下面这种打开文件的方式with open('data', 'r', encoding='utf-8') ...

weixin_39609500的博客 198

python里with as_理解Python中的with…as…语法

使用语言的好特性,而不是那些糟糕的特性————不知道谁说的好久不学习python的语法了,上次去面试,和面试官聊到了python中的with-as statement(也称context manager),挺感兴趣的,这两天学习了一番,收获颇丰在此分享。先说明一个常见问题,文件打开:其实我个人不止一次在网上看到有这么写的了,这个是错的。 首先正确的如下:很麻烦不是么,但正确的方法就是这么写。 我们...

weixin_39916360的博客 211

Python with 语句的深入理解:优雅处理资源管理 @contextmanager

大家都用过来读写文件,但可能较少去实现自己的 context manager。今天我们就通过几个实用场景,来深入理解这个优雅的语法特性。

记录学习痕迹的公众号:Piper蛋窝 965

一文读懂 with ... as 语句的来龙去脉

本文是作者无名小妖投稿的原创文章,文章结合示例代码对 with ... as 的来龙去脉做了详尽分析,我对其中部分内容有细微调整和排版处理。写博客不仅可以加深对知识的深入...

Python之禅的专栏 614

【Python】文件操作与with语句

本文深入解析Python文件操作与with语句的优雅资源管理机制。首先介绍传统文件操作流程及潜在问题,对比展示了with语句自动管理资源的优势。详细讲解了with语句的语法结构和工作原理,包括上下文管理器协议(__enter__和__exit__方法)。文章还提供了contextlib模块创建上下文管理器的简化方式,以及多个实用内置上下文管理器(如suppress、redirect_stdout等)的应用场景。最后通过数据库事务管理和计时器两个实战案例,演示了如何自定义高效的上下文管理器。这些技术能帮助开发

Kratzdisteln的博客 903

Python的with和as使用方法

with语句的作用对于一个事先需要设置事后需要清理的任务,with可以很简洁的处理并且监控中间的异常。但是实际上它的功能完全可以用try-except-else-finally语句实现,但是with-as更加简洁,可以看做try语句的简化版。非常常见的例子是文件的打开同样的功能,如果用try语句f = open("1.txt","w") try: data = f.read() final...

qq_26714479的博客 3217

Python基础 - with语句 自动管理文件资源

Python with语句:自动文件资源管理 本文介绍了Python中with语句的核心概念及其在文件资源管理中的应用。主要内容包括: with语句基础:通过上下文管理器协议实现自动资源管理,语法简洁且异常安全 传统文件操作问题:手动关闭文件存在异常安全性差、易忘记关闭和资源泄露风险 with语句优势:自动资源管理、代码简洁、异常安全性和统一管理模式 上下文管理器原理:深入解析__enter__和__exit__方法实现机制 实际应用案例:包括文本/JSON/二进制文件处理和多文件同时操作 with语句通过

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

深入理解 Python 中的 with 语句:优雅地管理资源

with 语句是 Python 中实现确定性资源管理的核心工具。它的设计哲学是:“申请即拥有,离开即释放”。通过上下文管理器协议,我们可以轻松实现资源的安全获取与释放。文件读写数据库连接与事务管理线程锁(threading.Lock)临时目录/文件(tempfile)网络套接字自定义资源(如 GPU 显存、硬件设备)🧠 记住一句话:“凡是需要成对操作的资源(打开/关闭、加锁/解锁、连接/断开),都应该考虑使用 with。

SunnyRivers 966
上一篇: 浅谈 Python 的 with 语句
下一篇: 51JOB:根据HR处理简历的一般流程,简历投递后会有如下几种状态出现
ctrigger
博客等级 码龄16年 1766粉丝 1575原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值