国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中with及contextlib的用法詳解

2019-11-25 16:06:59
字體:
來源:轉載
供稿:網友

本文實例講述了Python中with及contextlib的用法。分享給大家供大家參考,具體如下:

平常Coding過程中,經常使用到的with場景是(打開文件進行文件處理,然后隱式地執行了文件句柄的關閉,同樣適合socket之類的,這些類都提供了對with的支持):

with file('test.py','r') as f :  print f.readline()

with的作用,類似try...finally...,提供一種上下文機制,要應用with語句的類,其內部必須提供兩個內置函數__enter__以及__exit__。前者在主體代碼執行前執行,后則在主體代碼執行后執行。as后面的變量,是在__enter__函數中返回的。通過下面這個代碼片段以及注釋說明,可以清晰明白__enter__與__exit__的用法:

#!encoding:utf-8class echo :  def output(self) :    print 'hello world'  def __enter__(self):    print 'enter'    return self #返回自身實例,當然也可以返回任何希望返回的東西  def __exit__(self, exception_type, exception_value, exception_traceback):    #若發生異常,會在這里捕捉到,可以進行異常處理    print 'exit'    #如果改__exit__可以處理改異常則通過返回True告知該異常不必傳播,否則返回False    if exception_type == ValueError :      return True    else:      return Falsewith echo() as e:  e.output()  print 'do something inside'print '-----------'with echo() as e:  raise ValueError('value error')print '-----------'with echo() as e:  raise Exception('can not detect')

運行結果:

contextlib是為了加強with語句,提供上下文機制的模塊,它是通過Generator實現的。通過定義類以及寫__enter__和__exit__來進行上下文管理雖然不難,但是很繁瑣。contextlib中的contextmanager作為裝飾器來提供一種針對函數級別的上下文管理機制。常用框架如下:

from contextlib import contextmanager@contextmanagerdef make_context() :  print 'enter'  try :    yield {}  except RuntimeError, err :    print 'error' , err  finally :    print 'exit'with make_context() as value :  print value

contextlib還有連個重要的東西,一個是nested,一個是closing,前者用于創建嵌套的上下文,后則用于幫你執行定義好的close函數。但是nested已經過時了,因為with已經可以通過多個上下文的直接嵌套了。下面是一個例子:

from contextlib import contextmanagerfrom contextlib import nestedfrom contextlib import closing@contextmanagerdef make_context(name) :  print 'enter', name  yield name  print 'exit', namewith nested(make_context('A'), make_context('B')) as (a, b) :  print a  print bwith make_context('A') as a, make_context('B') as b :  print a  print bclass Door(object) :  def open(self) :    print 'Door is opened'  def close(self) :    print 'Door is closed'with closing(Door()) as door :  door.open()

運行結果:

總結:python有很多強大的特性,由于我們平常總習慣于之前C++或java的一些編程習慣,時常忽略這些好的機制。因此,要學會使用這些python特性,讓我們寫的python程序更像是python。

更多關于Python相關內容可查看本站專題:《Python數據結構與算法教程》、《Python Socket編程技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 淅川县| 勐海县| 衡山县| 筠连县| 奇台县| 基隆市| 江门市| 合阳县| 翁牛特旗| 建阳市| 崇阳县| 从江县| 皋兰县| 西华县| 乌兰察布市| 翁牛特旗| 无极县| 什邡市| 泰安市| 琼中| 溆浦县| 白城市| 自贡市| 阳春市| 涞水县| 江北区| 徐闻县| 紫金县| 宜宾市| 英吉沙县| 崇礼县| 谢通门县| 女性| 广河县| 开鲁县| 定州市| 广灵县| 台南县| 临朐县| 阳新县| 桃江县|