成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

總覽

在Python中,您需要通過打開文件來訪問文件。您可以使用 open()函數(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 做點啥

在寫入模式下打開output.txt

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

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

原理

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

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

with expression [as variable]: with-block

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

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

要在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)建的同一對象 ,因為 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會抑制異常。通常很少需要抑制異常,因為如果您這樣做,包含 ’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ī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 __()方法有點復(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)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美+亚洲+精品+三区| 亚洲免费三区一区二区| 成人深夜福利app| 91啪九色porn原创视频在线观看| 韩国一区二区三区在线观看| 久久一区精品| 精品99一区二区| 中文子幕无线码一区tr| 青椒成人免费视频| av一区二区三区| 香蕉久久国产| 精品处破学生在线二十三| 国产麻豆精品久久一二三| 亚洲欧美一级二级三级| 久久蜜桃资源一区二区老牛| 亚洲精品自拍动漫在线| 国产精品99久久久| 亚洲精品日韩在线观看| 欧美日韩午夜在线视频| 亚洲欧美影音先锋| 久久99精品国产.久久久久久 | 欧美一区二区福利在线| 一区二区激情视频| 成人美女在线视频| 精品美女在线播放| 日韩av电影免费观看高清完整版| 欧美不卡一卡二卡免费版| 欧美不卡在线视频| 99久久精品免费看| 在线观看成人免费视频| 国产精品不卡视频| 国产成都精品91一区二区三| 久久精品官网| 国产人久久人人人人爽| 韩国女主播一区| 性色一区二区| 日产国产欧美视频一区精品| 欧美日韩中文一区| 国产成人av资源| 在线观看视频91| 国产一区二区在线观看视频| 欧美电影免费提供在线观看| 美女高潮久久久| 亚洲最新在线| 色综合久久天天| 国产精品三级在线观看| 国产成人日日夜夜| 久久尤物电影视频在线观看| 国产激情视频一区二区在线观看 | 欧美综合二区| 久久国产人妖系列| 久久久777| 老司机午夜精品| 精品日韩在线观看| 亚洲国产一区二区三区在线播| 亚洲国产另类av| 亚洲看片一区| 亚洲成人动漫精品| 伊人成年综合电影网| 久久久久国产免费免费| 国产精品一区在线观看你懂的| 欧美xingq一区二区| 欧美日韩另类综合| 久久综合九色综合97_久久久| 欧美一区高清| 午夜激情一区二区三区| 亚洲一区二区在| 亚洲乱码国产乱码精品精小说| 一本一道波多野结衣一区二区| 久久99久久久久久久久久久| 久久亚洲春色中文字幕久久久| 欧美私人啪啪vps| 一区二区三区丝袜| 欧美高清视频一二三区| 日韩电影在线观看一区| 欧美日产国产精品| 免费人成在线不卡| 精品久久久久久久人人人人传媒 | 亚洲精品欧美精品| 麻豆成人综合网| 欧美高清一级片在线观看| 色悠久久久久综合欧美99| 91丨九色丨尤物| 蜜桃av一区二区三区电影| 欧美激情在线观看视频免费| 一区二区三区四区国产| 国产美女视频91| 亚洲精品水蜜桃| 日韩一级高清毛片| 国产69精品久久久久777| 国产精品天美传媒| 在线影视一区二区三区| 麻豆国产精品一区二区三区 | 午夜电影网一区| 精品久久久三级丝袜| 先锋影音国产精品| 成人国产一区二区三区精品| 精品国一区二区三区| 国产精品社区| 午夜一区二区三区视频| 日韩午夜av电影| 国产精品一区二区在线观看| 丁香婷婷综合色啪| 亚洲成年人网站在线观看| 久久久精品日韩欧美| 在线观看日韩精品| 亚洲麻豆av| 成人黄色国产精品网站大全在线免费观看| 亚洲成年人影院| 国产精品色噜噜| 777欧美精品| 成人精品鲁一区一区二区| 亚洲精品中文在线影院| 精品免费国产二区三区| 色欧美日韩亚洲| 国产一区二区在线观看免费播放| 激情综合网激情| 一区二区欧美在线观看| 精品国产乱码91久久久久久网站| 欧美综合一区二区三区| 亚洲精品影院在线观看| 国产调教视频一区| 国产亚洲一区在线| 99视频一区二区| 精品一区二区三区在线观看国产| 亚洲女同女同女同女同女同69| 日韩精品一区二区三区视频播放 | 精品国产亚洲在线| 欧美综合一区二区| 中日韩男男gay无套| 91影院在线观看| 国产一区二区三区四区五区美女| 爽好久久久欧美精品| 欧美日韩在线直播| 国产亚洲在线| 久久精品一区二区三区不卡牛牛| 欧美日本在线看| 色婷婷av久久久久久久| 国产精品美女久久久| 欧美一区激情| a美女胸又www黄视频久久| 国产一区二区精品在线观看| 午夜国产不卡在线观看视频| 亚洲精品中文在线观看| 欧美激情中文字幕| 久久综合久久鬼色| 欧美一级国产精品| 欧美日韩国产另类一区| 色天天综合色天天久久| 男人的天堂亚洲在线| 亚洲青涩在线| 欧美三级网页| 欧美伊人影院| 成人av资源在线| 国产91精品欧美| 国产最新精品免费| 久久精品国产精品亚洲综合| 亚洲成人av中文| 亚洲成人激情综合网| 亚洲一区中文在线| 国产日韩精品视频一区| 日韩欧美中文字幕精品| 制服视频三区第一页精品| 欧美精品粉嫩高潮一区二区| 久久综合久久久| 久久久久久久久久久一区| 国产农村妇女精品一二区 | 天天免费综合色| 爽好久久久欧美精品| 亚洲与欧洲av电影| 亚洲三级免费观看| 欧美一二三四区在线| 欧美福利一区二区| 在线播放欧美女士性生活| 制服丝袜亚洲色图| 欧美一区二区三区免费在线看| 欧美精品久久一区二区三区| 欧美人xxxx| 日韩欧美高清dvd碟片| 精品av综合导航| 久久亚洲捆绑美女| 国产欧美精品区一区二区三区 | 久久精品国产第一区二区三区最新章节 | 国产农村妇女精品一区二区| 亚洲一区二区四区| 色婷婷av一区二区三区软件 | 久久综合色婷婷| 久久免费电影网| 欧美国产1区2区| 亚洲人成7777| 午夜久久久久久久久| 久久久久久一二三区| 国产精品福利影院| 一个色综合网站| 日本欧美肥老太交大片| 久99久精品视频免费观看| 丰满放荡岳乱妇91ww| 91美女福利视频| 亚洲精品专区| 久久综合狠狠综合久久综青草|