python with关键字学习
1.with語句時用于對try except finally 的優(yōu)化,讓代碼更加美觀,
例如常用的開發(fā)文件的操作,用try except finally 實現(xiàn):
f=open('file_name','r') try:r=f.read() except:pass finally:f.close()打開文件的時候,為了能正常釋放文件的句柄,都要加個try,然后再finally里把f close掉,但是這樣的代碼不美觀,finally就像個尾巴,一直托在后面,尤其是當(dāng)try里面的語句時幾十行
用with的實現(xiàn):
with open('file_name','r') as f:r=f.read()這條語句就好簡潔很多,當(dāng)with里面的語句產(chǎn)生異常的話,也會正常關(guān)閉文件
?
2.除了打開文件,with語句還可以用于哪些地方呢?
with只適用于上下文管理器的調(diào)用,除了文件外,with還支持?threading、decimal等模塊,當(dāng)然我們也可以自己定義可以給with調(diào)用的上下文管理器
?
2.1使用類定義上下文管理器
class A():def __enter__(self):self.a=1return selfdef f(self):print 'f'def __exit__(self,a,b,c):print 'exit' def func():return A()with A() as a:1/0a.f()print a.a使用類定義上下文管理器需要在類上定義__enter__和__exit__方法,執(zhí)行with A() as a: 語句時會先執(zhí)行__enter__方法,這個方法的返回值會賦值給后面的a變量,當(dāng)with里面的語句產(chǎn)生異常或正常執(zhí)行完時,都好調(diào)用類中的__exit__方法。
?
2.2使用生成器定義上下文管理器
from contextlib import contextmanager@contextmanager def demo():print '這里的代碼相當(dāng)于__enter__里面的代碼'yield 'i ma value'print '這里的代碼相當(dāng)于__exit__里面的代碼'with demo() as value:print value?
2.3?自定義支持 closing 的對象
class closing(object):def __init__(self, thing):self.thing = thingdef __enter__(self):return self.thingdef __exit__(self, *exc_info):self.thing.close()class A():def __init__(self):self.thing=open('file_name','w')def f(self):print '運行函數(shù)'def close(self):self.thing.close()with closing(A()) as a:a.f()轉(zhuǎn)載于:https://www.cnblogs.com/lnn123/p/10481297.html
總結(jié)
以上是生活随笔為你收集整理的python with关键字学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序中的渐变色
- 下一篇: 自定义DataSet