python 关键字 with_python 关键字with

1.with语句时用于对try except finally 的优化,让代码更加美观,

例如常用的开发文件的操作,用try except finally 实现:

f=open('file_name','r')try:

r=f.read()except:pass

finally:

f.close()

打开文件的时候,为了能正常释放文件的句柄,都要加个try,然后再finally里把f close掉,但是这样的代码不美观,finally就像个尾巴,一直托在后面,尤其是当try里面的语句时几十行

用with的实现:

with open('file_name','r') as f:

r=f.read()

这条语句就好简洁很多,当with里面的语句产生异常的话,也会正常关闭文件

2.除了打开文件,with语句还可以用于哪些地方呢?

with只适用于上下文管理器的调用,除了文件外,with还支持 threading、decimal等模块,当然我们也可以自己定义可以给with调用的上下文管理器

2.1使用类定义上下文管理器

classA():def __enter__(self):

self.a=1

returnselfdeff(self):print('f')def __exit__(self,a,b,c):print('exit')deffunc():returnA()

with A() as a:

a.f()print(a.a)

输出:

997a5630e14519869ae7aaf533e9e3ca.png

使用类定义上下文管理器需要在类上定义__enter__和__exit__方法,执行with A() as a: 语句时会先执行__enter__方法,这个方法的返回值会赋值给后面的a变量,当with里面的语句产生异常或正常执行完时,都好调用类中的__exit__方法。

2.2使用生成器定义上下文管理器

from contextlib importcontextmanager

@contextmanagerdefdemo():print('这里的代码相当于__enter__里面的代码')yield 'i ma value'

print('这里的代码相当于__exit__里面的代码')

with demo() as value:print(value)

2.3 自定义支持 closing 的对象

classclosing(object):def __init__(self, thing):

self.thing=thingdef __enter__(self):returnself.thingdef __exit__(self, *exc_info):

self.thing.close()classA():def __init__(self):

self.thing=open('test1.txt','r')deff(self):print('运行函数')defread_txt(self):print(self.thing.read())defclose(self):

self.thing.close()

with closing(A()) as a:

a.f()

a.read_txt()

输出:

70039eb05805e830d0a6f15f9af65c20.png

在开发的过程中,会有很多对象在使用之后,是需要执行一条或多条语句来进行关闭,释放等操作的,例如上面说的的文件,还有数据库连接,锁的获取等,这些收尾的操作会让代码显得累赘,也会造成由于程序异常跳出后,没有执行到这些收尾操作,而导致一些系统的异常,还有就是很多程序员会忘记写上这些操作-_-!-_-!,为了避免这些错误的产生,with语句就被生产出来了。with语句的作用就是让程序员不用写这些收尾的代码,并且即使程序异常也会执行到这些代码(finally的作用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值