电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

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

總覽

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

with 語句

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

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

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

如果沒有 with 語句,我們將編寫如下內容:

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

with 語句用法

’with’ 語句是一個新的控制流結構,其基本結構為:

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()。會被自動調用。

原理

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

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

with expression [as variable]: with-block

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

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

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

from __future__ import with_statement

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

現在,一些標準的 Python 對象支持上下文管理協議,并且可以與 ’with’ 語句一起使用。文件對象即是其中之一:

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

執行此語句后,即使for循環在代碼塊中途出現異常,f中的文件對象也將自動關閉。

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

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

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

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

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

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

編寫上下文管理器

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

上下文管理協議的高級解釋是:

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

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

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

假設有一個代表數據庫連接的對象。我們的目標是讓用戶編寫如下代碼:

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

如果塊中的代碼完美運行,則應該提交事務;如果有異常,則應回滾事務。這是我假設的DatabaseConnection的基本接口:

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

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

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 __()方法有點復雜,該方法必須檢查是否發生異常。如果沒有異常,則提交事務。如果存在異常,則事務將回滾。

在下面的代碼中,執行會從函數的末尾開始,并返回默認值None。 None為假,因此將自動重新引發異常。如果需要,可以更加明確,并 在標記的位置添加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,它使您可以編寫一個生成器函數,而不用定義一個新類。生成器應恰好產生一個值。直到yield的代碼 將作為__enter __()方法執行,并且yield的值將是該方法的返回值,該返回值將綁定到’ with ’語句的as子句中的變量(如果有)。屈服后的代碼將在 __exit __()方法中執行。塊中引發的任何異常都將由yield語句引發。

上一節中的數據庫示例可以使用以下裝飾器編寫為:

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,...)功能結合了一些上下文管理器,所以你不需要寫嵌套“不與 ”語句。在此示例中,單個’ with ’語句既啟動數據庫事務并獲取線程鎖:

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

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

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

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

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 包塑丝_高铁绑丝_地暖绑丝_涂塑丝_塑料皮铁丝_河北创筹金属丝网制品有限公司 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 伺服电机_直流伺服_交流伺服_DD马达_拓达官方网站 | 活性炭-果壳木质煤质柱状粉状蜂窝活性炭厂家价格多少钱 | 导电银胶_LED封装导电银胶_半导体封装导电胶厂家-上海腾烁 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First| 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 哲力实业_专注汽车涂料汽车漆研发生产_汽车漆|修补油漆品牌厂家 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 发电机组|柴油发电机组-批发,上柴,玉柴,潍柴,康明斯柴油发电机厂家直销 | 亚洲工业智能制造领域专业门户网站 - 亚洲自动化与机器人网 | 广州展览设计公司_展台设计搭建_展位设计装修公司-众派展览装饰 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 防火板_饰面耐火板价格、厂家_品牌认准格林雅 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 办公室装修_上海办公室设计装修_时尚办公新主张-后街印象 | 厂厂乐-汇聚海量采购信息的B2B微营销平台-厂厂乐官网 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 气象监测系统_气象传感器_微型气象仪_气象环境监测仪-山东风途物联网 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 碳纤维布-植筋胶-灌缝胶-固特嘉加固材料公司 | 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | 铝合金电阻-无源谐波滤波器-上海稳达电讯设备厂 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 医用酒精_84消毒液_碘伏消毒液等医用消毒液-漓峰消毒官网 | 螺纹三通快插接头-弯通快插接头-宁波舜驰气动科技有限公司 | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 皮带机-带式输送机价格-固定式胶带机生产厂家-河南坤威机械 | 阻垢剂-反渗透缓蚀阻垢剂厂家-山东鲁东环保科技有限公司 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 北京律师事务所_房屋拆迁律师_24小时免费法律咨询_云合专业律师网 |