首頁  >  文章  >  後端開發  >  Python基礎教程之with、contextlib的實例用法詳解

Python基礎教程之with、contextlib的實例用法詳解

巴扎黑
巴扎黑原創
2017-08-09 11:02:251601瀏覽

這篇文章主要介紹了Python中with及contextlib的用法,結合實例形式較為詳細的分析了with及contextlib的功能、使用方法與相關注意事項,需要的朋友可以參考下

#本文實例講述了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-8
class 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 False
with 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
@contextmanager
def 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 contextmanager
from contextlib import nested
from contextlib import closing
@contextmanager
def make_context(name) :
  print 'enter', name
  yield name
  print 'exit', name
with nested(make_context('A'), make_context('B')) as (a, b) :
  print a
  print b
with make_context('A') as a, make_context('B') as b :
  print a
  print b
class 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基礎教程之with、contextlib的實例用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn