欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python語(yǔ)言中with as的用法使用詳解

 更新時(shí)間:2018年02月23日 10:19:12   作者:鶴鶴有明  
本篇文章主要介紹了python語(yǔ)言中with as的用法使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

With語(yǔ)句是什么?

有一些任務(wù),可能事先需要設(shè)置,事后做清理工作。對(duì)于這種場(chǎng)景,Python的with語(yǔ)句提供了一種非常方便的處理方式。一個(gè)很好的例子是文件處理,你需要獲取一個(gè)文件句柄,從文件中讀取數(shù)據(jù),然后關(guān)閉文件句柄。
如果不用with語(yǔ)句,代碼如下:

file = open("/tmp/foo.txt")
data = file.read()
file.close()

這里有兩個(gè)問(wèn)題。一是可能忘記關(guān)閉文件句柄;二是文件讀取數(shù)據(jù)發(fā)生異常,沒(méi)有進(jìn)行任何處理。下面是處理異常的加強(qiáng)版本:

file = open("/tmp/foo.txt")
try:
  data = file.read()
finally:
  file.close()

雖然這段代碼運(yùn)行良好,但是太冗長(zhǎng)了。這時(shí)候就是with一展身手的時(shí)候了。除了有更優(yōu)雅的語(yǔ)法,with還可以很好的處理上下文環(huán)境產(chǎn)生的異常。下面是with版本的代碼:

with open("/tmp/foo.txt") as file:
  data = file.read()

with如何工作?

這看起來(lái)充滿魔法,但不僅僅是魔法,Python對(duì)with的處理還很聰明。基本思想是with所求值的對(duì)象必須有一個(gè)__enter__()方法,一個(gè)__exit__()方法。

緊跟with后面的語(yǔ)句被求值后,返回對(duì)象的__enter__()方法被調(diào)用,這個(gè)方法的返回值將被賦值給as后面的變量。當(dāng)with后面的代碼塊全部被執(zhí)行完之后,將調(diào)用前面返回對(duì)象的__exit__()方法。

下面例子可以具體說(shuō)明with如何工作:

#!/usr/bin/env python
# with_example01.py
 
class Sample:
  def __enter__(self):
    print "In __enter__()"
    return "Foo"
 
  def __exit__(self, type, value, trace):
    print "In __exit__()"
 
def get_sample():
  return Sample()
 
with get_sample() as sample:
  print "sample:", sample

運(yùn)行代碼,輸出如下

In __enter__()
sample: Foo
In __exit__()

正如你看到的,

1. __enter__()方法被執(zhí)行

2. __enter__()方法返回的值 - 這個(gè)例子中是"Foo",賦值給變量'sample'

3. 執(zhí)行代碼塊,打印變量"sample"的值為 "Foo"

4. __exit__()方法被調(diào)用

with真正強(qiáng)大之處是它可以處理異常??赡苣阋呀?jīng)注意到Sample類(lèi)的__exit__方法有三個(gè)參數(shù)- val, type 和 trace。 這些參數(shù)在異常處理中相當(dāng)有用。我們來(lái)改一下代碼,看看具體如何工作的。

#!/usr/bin/env python
# with_example02.py
class Sample:
  def __enter__(self):
    return self
 
  def __exit__(self, type, value, trace):
    print "type:", type
    print "value:", value
    print "trace:", trace
 
  def do_something(self):
    bar = 1/0
    return bar + 10
 
with Sample() as sample:
  sample.do_something()

這個(gè)例子中,with后面的get_sample()變成了Sample()。這沒(méi)有任何關(guān)系,只要緊跟with后面的語(yǔ)句所返回的對(duì)象有__enter__()和__exit__()方法即可。此例中,Sample()的__enter__()方法返回新創(chuàng)建的Sample對(duì)象,并賦值給變量sample。

代碼執(zhí)行后:

bash-3.2$ ./with_example02.py
type: <type 'exceptions.ZeroDivisionError'>
value: integer division or modulo by zero
trace: <traceback object at 0x1004a8128>
Traceback (most recent call last):
  File "./with_example02.py", line 19, in <module>
    sample.do_something()
  File "./with_example02.py", line 15, in do_something
    bar = 1/0
ZeroDivisionError: integer division or modulo by zero

實(shí)際上,在with后面的代碼塊拋出任何異常時(shí),__exit__()方法被執(zhí)行。正如例子所示,異常拋出時(shí),與之關(guān)聯(lián)的type,value和stack trace傳給__exit__()方法,因此拋出的ZeroDivisionError異常被打印出來(lái)了。開(kāi)發(fā)庫(kù)時(shí),清理資源,關(guān)閉文件等等操作,都可以放在__exit__方法當(dāng)中。

因此,Python的with語(yǔ)句是提供一個(gè)有效的機(jī)制,讓代碼更簡(jiǎn)練,同時(shí)在異常產(chǎn)生時(shí),清理工作更簡(jiǎn)單。

with-as語(yǔ)句

從python2.6開(kāi)始,with就成為默認(rèn)關(guān)鍵字了。With是一個(gè)控制流語(yǔ)句,跟if for while try之類(lèi)的是一類(lèi),with可以用來(lái)簡(jiǎn)化try-finally代碼,看起來(lái)比try finally更清晰,所以說(shuō)with用很優(yōu)雅的方式處理上下文環(huán)境產(chǎn)生的異常。with關(guān)鍵字的用法如下:

with expression as variable:
  with block

該代碼快的執(zhí)行過(guò)程是:

1.先執(zhí)行expression,然后執(zhí)行該表達(dá)式返回的對(duì)象實(shí)例的__enter__函數(shù),然后將該函數(shù)的返回值賦給as后面的變量。(注意,是將__enter__函數(shù)的返回值賦給變量)

2.然后執(zhí)行with block代碼塊,不論成功,錯(cuò)誤,異常,在with block執(zhí)行結(jié)束后,會(huì)執(zhí)行第一步中的實(shí)例的__exit__函數(shù)

with-as語(yǔ)句使用舉例

(1)打開(kāi)文件的例子

with-as語(yǔ)句最常見(jiàn)的一個(gè)用法是打開(kāi)文件的操作,如下:

with open("decorator.py") as file:
  print file.readlines()

(2)自定義

with語(yǔ)句后面的對(duì)象必須要有__enter__和__exit__方法,如下是一個(gè)自定義的例子:

class WithTest():
  def __init__(self,name):
    self.name = name
    pass

  def __enter__(self):
    print "This is enter function"
    return self 

  def __exit__(self,e_t,e_v,t_b):
    print "Now, you are exit"

  def playNow(self):
    print "Now, I am playing"

print "**********"
with WithTest("coolboy") as test:
  print type(test)
  test.playNow() 
  print test.name
print "**********"

上述代碼運(yùn)行的結(jié)果如下:

**********
This is enter function
<type 'instance'>
Now, I am playing
coolboy
Now, you are exit
**********

分析以上代碼: 一二行,執(zhí)行open函數(shù),該函數(shù)返回一個(gè)文件對(duì)象的實(shí)例,然后執(zhí)行了該實(shí)例的__enter__函數(shù),該函數(shù)返回此實(shí)例本身,最后賦值給file變量。從456句可以印證。

自定義的類(lèi)WithTest,重載了__enter__和__exit__函數(shù),就可以實(shí)現(xiàn)with這樣的語(yǔ)法了,注意在__enter__函數(shù)中,返回了self,在__exit__函數(shù)中,可以通過(guò)__exit__的返回值來(lái)指示with-block部分發(fā)生的異常是否需要reraise,如果返回false,則會(huì)reraise with block異常,如果返回ture,則就像什么也沒(méi)發(fā)生。

上下文管理器contextlib模塊對(duì)with-as的支持

contextlib 模塊提供了3個(gè)對(duì)象:裝飾器 contextmanager、函數(shù) nested 和上下文管理器 closing。使用這些對(duì)象,可以對(duì)已有的生成器函數(shù)或者對(duì)象進(jìn)行包裝,加入對(duì)上下文管理協(xié)議的支持,避免了專(zhuān)門(mén)編寫(xiě)上下文管理器來(lái)支持 with 語(yǔ)句。

以contextlib的closing來(lái)說(shuō),closing幫助實(shí)現(xiàn)了__enter__和__exit__方法,用戶(hù)不需要自己再實(shí)現(xiàn)這兩個(gè)方法,但是被closing分裝的對(duì)象必須提供close方法。contextlib.closing類(lèi)的實(shí)現(xiàn)代碼如下:

class closing(object):
  # help doc here
  def __init__(self, thing):
    self.thing = thing
  def __enter__(self):
    return self.thing
  def __exit__(self, *exc_info):
    self.thing.close()

下面是一個(gè)使用contextlib.closing的例子:

import contextlib
request_url = ('http://www.sina.com.cn/')
with contextlib.closing(urlopen(request_url)) as response:
  return response.read().decode('utf-8')

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實(shí)現(xiàn)電子書(shū)翻頁(yè)小程序

    python實(shí)現(xiàn)電子書(shū)翻頁(yè)小程序

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)電子書(shū)翻頁(yè)小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Python7個(gè)爬蟲(chóng)小案例詳解(附源碼)中篇

    Python7個(gè)爬蟲(chóng)小案例詳解(附源碼)中篇

    這篇文章主要介紹了Python7個(gè)爬蟲(chóng)小案例詳解(附源碼)中篇,本文章內(nèi)容詳細(xì),通過(guò)案例可以更好的理解爬蟲(chóng)的相關(guān)知識(shí),七個(gè)例子分為了三部分,本次為中篇,共有二道題,需要的朋友可以參考下
    2023-01-01
  • python 批量將中文名轉(zhuǎn)換為拼音

    python 批量將中文名轉(zhuǎn)換為拼音

    這篇文章主要介紹了python 批量將中文名轉(zhuǎn)換為拼音,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-02-02
  • pandas通過(guò)loc生成新的列方法

    pandas通過(guò)loc生成新的列方法

    今天小編就為大家分享一篇pandas通過(guò)loc生成新的列方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • python?pandas庫(kù)讀取excel/csv中指定行或列數(shù)據(jù)

    python?pandas庫(kù)讀取excel/csv中指定行或列數(shù)據(jù)

    通過(guò)閱讀表格,可以發(fā)現(xiàn)Pandas中提供了非常豐富的數(shù)據(jù)讀寫(xiě)方法,下面這篇文章主要給大家介紹了關(guān)于python利用pandas庫(kù)讀取excel/csv中指定行或列數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Python使用Tkinter實(shí)現(xiàn)機(jī)器人走迷宮

    Python使用Tkinter實(shí)現(xiàn)機(jī)器人走迷宮

    這篇文章主要為大家詳細(xì)介紹了Python使用Tkinter實(shí)現(xiàn)機(jī)器人走迷宮,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Python+Selenium自動(dòng)化環(huán)境搭建與操作基礎(chǔ)詳解

    Python+Selenium自動(dòng)化環(huán)境搭建與操作基礎(chǔ)詳解

    Selenium是如今最常用的自動(dòng)化測(cè)試工具之一,支持快速開(kāi)發(fā)自動(dòng)化測(cè)試框架,且支持在多種瀏覽器上執(zhí)行測(cè)試。本文將介紹關(guān)于Selenium?Python自動(dòng)化腳本環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Python使用PIL.image保存圖片

    Python使用PIL.image保存圖片

    PIL庫(kù)支持圖像存儲(chǔ)、顯示和處理,它能夠處理幾乎所有圖片格式,可以完成對(duì)圖像的縮放、剪裁、疊加以及向圖像添加線條、圖像和文字等操作,下面這篇文章主要給大家介紹了關(guān)于Python使用PIL.image保存圖片的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • python對(duì)象及面向?qū)ο蠹夹g(shù)詳解

    python對(duì)象及面向?qū)ο蠹夹g(shù)詳解

    這篇文章主要介紹了python對(duì)象及面向?qū)ο蠹夹g(shù),結(jié)合實(shí)例形式詳細(xì)分析了Python面向?qū)ο笏婕暗念?lèi)、對(duì)象、方法、屬性等概念與使用技巧,需要的朋友可以參考下
    2016-07-07
  • 如何將anaconda安裝配置的mmdetection環(huán)境離線拷貝到另一臺(tái)電腦

    如何將anaconda安裝配置的mmdetection環(huán)境離線拷貝到另一臺(tái)電腦

    這篇文章主要介紹了如何將anaconda安裝配置的mmdetection環(huán)境離線拷貝到另一臺(tái)電腦,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論