日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python中的With語句的使用及原理

瀏覽:127日期:2022-07-16 08:20:26

總覽

在Python中,您需要通過打開文件來訪問文件。您可以使用 open()函數(shù)來實(shí)現(xiàn)。Open 返回一個文件對象,該文件對象具有用于獲取有關(guān)已打開文件的信息和對其進(jìn)行操作的方法和屬性。

with 語句

使用 “with” 語句,使代碼簡潔,處理異常也更優(yōu)雅。

“with語句通過封裝常用的準(zhǔn)備工作和清除任務(wù)來簡化異常處理。”

此外,它將自動關(guān)閉文件。with 語句提供了一種確保始終使用清理的方法。

如果沒有 with 語句,我們將編寫如下內(nèi)容:

file = open('welcome.txt')data = file.read()print(data)file.close() # 文件用完一定要關(guān)閉

with 語句用法

’with’ 語句是一個新的控制流結(jié)構(gòu),其基本結(jié)構(gòu)為:

with expression [as variable]: with-block

使用 with 打開文件非常簡單:使用open(filename) as file:

with open('welcome.txt') as file: # file 做為對文件對象的引用 data = file.read() # 使用 data 做點(diǎn)啥

在寫入模式下打開output.txt

with open(’output.txt’, ’w’) as file: # 輸出到file file.write(’Hi there!’)

注意,我們不必編寫 file.close()。會被自動調(diào)用。

原理

’ with ’語句簡化了以前使用try...finally塊來確保執(zhí)行清除代碼的代碼。在本節(jié)中,我將討論通常使用的語句。在下一節(jié)中,我將檢查實(shí)現(xiàn)細(xì)節(jié),并說明如何編寫用于此語句的對象。

with 后面的表達(dá)式需支持上下文管理協(xié)議 (即,__enter__() 和__exit__() 方法)。

with expression [as variable]: with-block

在執(zhí)行 with-block 之前調(diào)用對象的__enter __() 方法,因此可以運(yùn)行setup設(shè)置代碼。可以能過 as 把表達(dá)式結(jié)果綁定到變量 variable(注意這里不是賦值到變量 variable)。

with 塊的執(zhí)行完成后,即使該塊引發(fā)了異常,該對象的 __exit__() 方法也會被調(diào)用,因此可以運(yùn)行清理代碼。

要在Python 2.5中啟用該語句,您需要在模塊中添加以下指令:

from __future__ import with_statement

該語句將始終在 Python 2.6 中啟用。

現(xiàn)在,一些標(biāo)準(zhǔn)的 Python 對象支持上下文管理協(xié)議,并且可以與 ’with’ 語句一起使用。文件對象即是其中之一:

with open(’/etc/passwd’, ’r’) as f: for line in f: print line ... 更多 ...

執(zhí)行此語句后,即使for循環(huán)在代碼塊中途出現(xiàn)異常,f中的文件對象也將自動關(guān)閉。

注意: 在這種情況下,f 是 open() 創(chuàng)建的同一對象 ,因?yàn)?file.__enter__()返回 self。

threading 模塊的鎖和條件變量也支持 ’with’ 語句:

lock = threading.Lock()with lock: # 代碼臨界區(qū) ...

該鎖在執(zhí)行 with 塊之前獲取,并在該塊完成后始終釋放。

decimal模塊中 的新 localcontext() 函數(shù)使保存和還原當(dāng)前decimal上下文變得容易,它封裝了計算所需的精度和舍入特征:

from decimal import Decimal, Context, localcontext# 顯示默認(rèn)精度: 28 位數(shù)字v = Decimal(’578’)print v.sqrt()with localcontext(Context(prec=16)): # 本代碼塊中使用16位精度. # 原始上下文將在退出塊后恢復(fù). print(v.sqrt())

編寫上下文管理器

在幕后,with 語句相當(dāng)復(fù)雜。大多數(shù)人只會在與現(xiàn)有對象一起使用 ’with’,并且不需要知道這些詳細(xì)信息,如果您想讓自己寫的類也支持 with語句,那就需要了解上下文管理器了。

上下文管理協(xié)議的高級解釋是:

該表達(dá)式將被求值并應(yīng)產(chǎn)生一個稱為``context manager’’的對象。上下文管理器必須包含 __enter__() 和 __exit__() 方法。 上下文管理器的 __enter__() 方法被調(diào)用。返回的值分配給 var 。如果不存在as var子句,則僅丟棄該值。 with 塊中的代碼被執(zhí)行。 如果 with 塊引發(fā)異常, 則使用異常詳細(xì)信息調(diào)用__exit__(type,value,traceback),該異常詳細(xì)信息由sys.exc_info() 返回 。該方法的返回值控制是否重新引發(fā)異常:任何 False 值都會重新引發(fā)異常,True會抑制異常。通常很少需要抑制異常,因?yàn)槿绻@樣做,包含 ’with’ 語句的代碼的作者將永遠(yuǎn)不會意識到任何錯誤。 如果 with 塊沒有引發(fā)異常,則仍然會調(diào)用__exit__()方法,此時參數(shù)type,value和traceback都是 None。

讓我們考慮一個例子。我不會提供詳細(xì)的代碼,而只會概述支持事務(wù)的數(shù)據(jù)庫所必需的方法。

(對于不熟悉數(shù)據(jù)庫術(shù)語的人:將對數(shù)據(jù)庫的一組更改分組為一個事務(wù)。可以提交事務(wù),這意味著將所有更改都寫入數(shù)據(jù)庫,也可以回滾,這意味著將所有更改都丟棄并刪除。數(shù)據(jù)庫未更改。有關(guān)更多信息,請參見任何數(shù)據(jù)庫教科書。)

假設(shè)有一個代表數(shù)據(jù)庫連接的對象。我們的目標(biāo)是讓用戶編寫如下代碼:

db_connection = DatabaseConnection()with db_connection as cursor: cursor.execute(’insert into ...’) cursor.execute(’delete from ...’) # ... more operations ...

如果塊中的代碼完美運(yùn)行,則應(yīng)該提交事務(wù);如果有異常,則應(yīng)回滾事務(wù)。這是我假設(shè)的DatabaseConnection的基本接口:

class DatabaseConnection: ... def __enter__ (self): # Code to start a new transaction cursor = self.cursor() return cursor

該__enter __()方法是很簡單的,只有到啟動新的事務(wù)。對于此應(yīng)用程序,結(jié)果光標(biāo)對象將是有用的結(jié)果,因此該方法將返回它。然后,用戶可以添加as cursor到其 with 語句中,以將游標(biāo)綁定到變量名。

class DatabaseConnection: # Database interface def cursor (self): 'Returns a cursor object and starts a new transaction' def commit (self): 'Commits current transaction' def rollback (self): 'Rolls back current transaction'

該__exit __()方法有點(diǎn)復(fù)雜,該方法必須檢查是否發(fā)生異常。如果沒有異常,則提交事務(wù)。如果存在異常,則事務(wù)將回滾。

在下面的代碼中,執(zhí)行會從函數(shù)的末尾開始,并返回默認(rèn)值None。 None為假,因此將自動重新引發(fā)異常。如果需要,可以更加明確,并 在標(biāo)記的位置添加return語句。

class DatabaseConnection: ... def __exit__ (self, type, value, tb): if tb is None: # No exception, so commit self.commit() else: # Exception occurred, so rollback. self.rollback() # return False

contextlib 模塊

contextlib 模塊提供了一些功能和裝飾器,這些功能和裝飾器對于編寫與 ’with’ 語句一起使用的對象很有用。

裝飾器稱為 contextmanager,它使您可以編寫一個生成器函數(shù),而不用定義一個新類。生成器應(yīng)恰好產(chǎn)生一個值。直到y(tǒng)ield的代碼 將作為__enter __()方法執(zhí)行,并且yield的值將是該方法的返回值,該返回值將綁定到’ with ’語句的as子句中的變量(如果有)。屈服后的代碼將在 __exit __()方法中執(zhí)行。塊中引發(fā)的任何異常都將由yield語句引發(fā)。

上一節(jié)中的數(shù)據(jù)庫示例可以使用以下裝飾器編寫為:

from contextlib import contextmanager@contextmanagerdef db_transaction (connection): cursor = connection.cursor() try: yield cursor except: connection.rollback() raise else: connection.commit()db = DatabaseConnection()with db_transaction(db) as cursor:

該contextlib模塊還具有嵌套(MGR1, MGR2,...)功能結(jié)合了一些上下文管理器,所以你不需要寫嵌套“不與 ”語句。在此示例中,單個’ with ’語句既啟動數(shù)據(jù)庫事務(wù)并獲取線程鎖:

lock = threading.Lock()with nested (db_transaction(db), lock) as (cursor, locked):

最后,Closeing(object)函數(shù)返回object,以便可以將其綁定到變量,并object.close()在塊的末尾調(diào)用。

import urllib, sysfrom contextlib import closingwith closing(urllib.urlopen(’http://bixuebihui.com’)) as f: for line in f: sys.stdout.write(line)

參考:

https://docs.python.org/2.5/whatsnew/pep-343.html

到此這篇關(guān)于Python中的With語句的使用及原理的文章就介紹到這了,更多相關(guān)Python With語句內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美a在线观看| 日韩精品欧美激情一区二区| 精品国产精品久久一区免费式| 日韩国产欧美| 亚洲一区二区日韩| 深夜视频一区二区| 国产精品欧美一区二区三区不卡| 国产视频一区三区| 久久三级福利| 成人国产精品一区二区免费麻豆| 日韩1区2区3区| 午夜日本精品| 国产成人精选| 国产精品theporn| 麻豆精品视频在线观看| 日本不卡一区二区三区| 亚洲精品在线国产| 综合色就爱涩涩涩综合婷婷| 亚洲精品网址| 国精品一区二区| 欧美日韩国产高清电影| 在线视频免费在线观看一区二区| 久久久久久久久久久9不雅视频| 高清久久精品| 欧美二区视频| 日韩在线一二三区| 一区二区电影在线观看| 亚洲三级网址| 欧美在线观看天堂一区二区三区| 国产另类在线| 中文在线а√天堂| 蜜臀va亚洲va欧美va天堂| 日韩综合小视频| 免费视频一区二区三区在线观看 | 色黄视频在线观看| 成人在线视频中文字幕| 久久久9色精品国产一区二区三区| 久久久久免费av| 亚洲小说春色综合另类电影| 日韩中文字幕视频网| 国产探花在线精品一区二区| 国内精品伊人| aa亚洲婷婷| 麻豆mv在线观看| 玖玖玖国产精品| 色综合视频一区二区三区日韩| 欧美一级二级视频| 久久天堂av| 国产高清亚洲| 亚洲久草在线| 91精品国产91久久久久久黑人| 中文字幕成人| 精品国产麻豆| 青青草精品视频| 亚洲一区区二区| 成人va天堂| 日本91福利区| 伊人影院久久| 天堂中文av在线资源库| 日韩国产成人精品| 亚洲高清激情| 国产日产精品_国产精品毛片| 中文国产一区| 日韩精品水蜜桃| 国产超碰精品| 97精品国产福利一区二区三区| 亚洲精品第一| 亚洲视频电影在线| 99精品视频在线| 国产精品久久久久久久久久10秀 | 在线观看视频免费一区二区三区| 国产精品v日韩精品v欧美精品网站| 天堂va在线高清一区| 99国产精品久久久久久久成人热| 91精品精品| 色一区二区三区四区| 国产精品视频一区二区三区| 日本午夜精品久久久| 色婷婷成人网| 欧美一级久久| 国产三级一区| 久久亚洲资源中文字| 久久不见久久见国语| 精品精品99| 四季av一区二区凹凸精品| 福利精品在线| 色婷婷狠狠五月综合天色拍| 欧美日韩中文字幕一区二区三区| 亚洲电影有码| 影音先锋久久精品| 亚洲精品大片| 国产亚洲精品美女久久 | av综合电影网站| 婷婷激情图片久久| 日韩中文字幕亚洲一区二区va在线 | 五月天综合网站| 国产视频一区免费看| 国产精品综合| 精品免费av在线| 蜜臀av一区二区在线免费观看| 日韩高清电影免费| 午夜影院一区| 日本aⅴ免费视频一区二区三区| 欧美一级网址| 国产精品99一区二区| 亚洲毛片网站| 亚洲啊v在线| 日韩精品欧美精品| 日韩在线观看不卡| 蜜臀精品久久久久久蜜臀| 亚洲91在线| 欧美成人亚洲| 日韩成人亚洲| 国产日韩中文在线中文字幕| av中文资源在线资源免费观看| 黄色亚洲免费| 91亚洲自偷观看高清| 亚洲精品成人一区| 亚洲成人精品| av最新在线| 国产精选久久| 日韩欧美激情电影| 蜜桃一区二区三区在线观看| 日韩精品免费一区二区在线观看 | 久久婷婷国产| 国产视频一区欧美| 国产精品久久久久av电视剧| 国产另类在线| 国产亚洲观看| 亚洲精品日韩久久| 亚洲欧美日本国产专区一区| 性欧美xxxx免费岛国不卡电影| 岛国av在线网站| 国产一区二区三区视频在线| 日本99精品| 国产精品尤物| 国产精品theporn| 国产伦乱精品| 精品久久在线| 国产精品一区二区精品| 日韩av网站在线免费观看| 日日摸夜夜添夜夜添国产精品| 首页国产欧美日韩丝袜| 日韩av专区| 日韩三区免费| 亚洲欧洲一区二区天堂久久| 激情五月色综合国产精品| 国产视频一区三区| 一区二区三区午夜视频| 欧美一区久久| 日本久久黄色| 午夜欧美视频| 偷拍亚洲精品| 中文在线а√天堂 | 老色鬼久久亚洲一区二区| 中文字幕日韩亚洲| 国产精品一区二区精品视频观看 | 国产欧美69| 国产福利片在线观看| 欧美日韩高清| 欧美高清一区| 丝袜亚洲另类欧美| 国产日韩中文在线中文字幕| 加勒比视频一区| 国产精品日韩| 久久精品国产99国产| 欧美日韩精品一本二本三本| 一区二区三区国产在线| 精品一区二区三区在线观看视频| 午夜av成人| 蜜桃91丨九色丨蝌蚪91桃色| 精品资源在线| 亚洲2区在线| 老牛国内精品亚洲成av人片 | 亚洲尤物在线| 欧美激情综合| 亚洲欧美日本国产| 99免费精品| 久久99偷拍| 三级一区在线视频先锋| 日韩欧美中文| 久久激情五月婷婷| 亚洲在线国产日韩欧美| 日韩久久视频| 久久一区精品| 亚洲色图国产| 午夜一级久久| 激情欧美亚洲| 久久久亚洲欧洲日产| 日韩中文字幕一区二区高清99| 最新日韩av| 亚洲成人免费| 国产精品传媒麻豆hd| 日韩精品亚洲一区二区三区免费| 亚洲午夜在线| 一区在线免费观看| 一区二区三区网站| av不卡在线| 午夜久久99| 久久久久网站|