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

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

Aug 09, 2017 am 11:02 AM
python with

這篇文章主要介紹了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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

模板化的優點和缺點有哪些? 模板化的優點和缺點有哪些? May 08, 2024 pm 03:51 PM

模板化的優點和缺點有哪些?

Google AI 為開發者發佈 Gemini 1.5 Pro 和 Gemma 2 Google AI 為開發者發佈 Gemini 1.5 Pro 和 Gemma 2 Jul 01, 2024 am 07:22 AM

Google AI 為開發者發佈 Gemini 1.5 Pro 和 Gemma 2

怎麼下載deepseek 小米 怎麼下載deepseek 小米 Feb 19, 2025 pm 05:27 PM

怎麼下載deepseek 小米

deepseek怎麼問他 deepseek怎麼問他 Feb 19, 2025 pm 04:42 PM

deepseek怎麼問他

evaluate函數怎麼保存 evaluate函數怎麼保存 May 07, 2024 am 01:09 AM

evaluate函數怎麼保存

NET40是什麼軟體 NET40是什麼軟體 May 10, 2024 am 01:12 AM

NET40是什麼軟體

deepseek該怎麼搜索 deepseek該怎麼搜索 Feb 19, 2025 pm 05:18 PM

deepseek該怎麼搜索

瀏覽器插件是什麼語言寫的 瀏覽器插件是什麼語言寫的 May 08, 2024 pm 09:36 PM

瀏覽器插件是什麼語言寫的

See all articles