with語句python_Python之with語句

Python之with語句

在Python中,我們在打開文件的時候,為了代碼的健壯性,通常要考慮一些異常情況,比如:

try:

ccfile= open('/path/data')

content=ccfile.readlines()

ccfile.close()exceptIOError:

log.write('no data read\n')

我們將真正干活的代碼扔到try語句塊中,如果文件操作出現異常,則寫一條錯誤日志;

考慮一種情況,如果文件打開成功,但readlines()調用失敗,異常處理會立即跳轉到except處執行,這樣文件關閉就沒有機會被執行到了。

一種解決辦法就是將close()語句放到finally子句中去,finally的特點是不管有無異常,都會被執行到。

try:try:

ccfile= open('/path/data')

content=ccfile.readlines()exceptIOError:

log.write('no data read\n')finallyccfile.close()

finally的另一種可選的風格:

try:try:

ccfile= open('/path/data')

content=ccfile.readlines()finallyIOError:

ccfile.close()exceptIOError:

log.write('no data read\n')

如上所述的標準化的 try-except和try-finally 的用法是保證資源的分配和回收,比如文件(數據、日志、數據庫等等)、線程資源、數據庫連接等,但它們書寫起來卻不夠優雅。with語句的目的在于從流程圖中把try、except、 finally關鍵字和資源分配、釋放相關代碼統統去掉,

with處理文件操作的一個實例:

with open('/etc/passwd') as f:for line inf:print(line)

這段代碼的作用:打開一個文件,如果一切正常,把文件對象賦值給f,然后用迭代器遍歷文件中每一行,當完成時,關閉文件;而無論在這段代碼的任何地方,如果發生異常,此時文件仍會被關閉。

with看起來如此簡單,但是其背后還有一些工作要做,因為你不能對Python的任意符號使用with語句,它僅能工作于支持上下文管理協議(context management protocol)的對象。也就是說,只有內建了“上下文管理”的對象可以和with一起工作,目前支持該協議的對象有:

file

decimal.Context

thread.LockType

threading.Lock

threading.RLock

threading.Condition

threading.Semaphore

threading.BoundedSemaphore

現在來看with的語法:

with context_expr as var:

with_suite

當with語句執行時,便執行上下文表達式(context_expr)來獲得一個上下文管理器,上下文管理器的職責是提供一個上下文對象,用于在with語句塊中處理細節:

一旦獲得了上下文對象,就會調用它的__enter__()方法,將完成with語句塊執行前的所有準備工作,如果with語句后面跟了as語句,則用__enter__()方法的返回值來賦值;

當with語句塊結束時,無論是正常結束,還是由于異常,都會調用上下文對象的__exit__()方法,__exit__()方法有3個參數,如果with語句正常結束,三個參數全部都是 None;如果發生異常,三個參數的值分別等于調用sys.exc_info()函數返回的三個值:類型(異常類)、值(異常實例)和跟蹤記錄(traceback),相應的跟蹤記錄對象。

因為上下文管理器主要作用于共享資源,__enter__()和__exit__()方法基本是干的需要分配和釋放資源的低層次工作,比如:數據庫連接、鎖分配、信號量加/減、狀態管理、文件打開/關閉、異常處理等。

現在,我們可以在自定義類里面創建__enter__()和__exit__()方法,這樣就可以配合with語句創建類實例了:

classA:def __enter__(self):print '__enter__() called'

def __exit__(self, e_t, e_v, t_b):print '__exit__() called'with A() as a:print('got instance')

可以看到輸出為:

__enter__() called

got instance__exit__() called

另外python庫中還有一個模塊contextlib,使你不用構造含有__enter__, __exit__的類就可以使用with:

from __future__ importwith_statementfrom contextlib importcontextmanager

@contextmanagerdefcontext():print 'entering the zone'

try:yield

exceptException, e:print 'with an error %s'%eraiseeelse:print 'with no error'with context():print '----in context call------'

參考文檔:

http://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443103.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css中的單位換算_css大小單位px em rem的轉換和詳解

css大小單位px em rem的轉換和詳解PX特點1. IE無法調整那些使用px作為單位的字體大小;2. 國外的大部分網站能夠調整的原因在于其使用了em或rem作為字體單位;3. Firefox能夠調整px和em,rem,但是96%以上的中國網民使用IE瀏覽器(或內…

有幾種部署模式_來!PyFlink 作業的多種部署模式

關于 PyFlink 的博客我們曾介紹過 PyFlink 的功能開發,比如,如何使用各種算子(Join/Window/AGG etc.),如何使用各種 Connector(Kafka, CSV, Socket etc.),還有一些實際的案例。這些都停留在開發階段,一旦開發完成&…

office2007每次打開都配置進度_office2007 每次打開word,excel等顯示正在配置Office Professional Plus 2007的解決方...

有時候 Office2007打開文檔,每次都提示需要安裝。配置,配置完成之后,下次打開又需要配置點擊取消就不能打開。非常的煩。ffice2007下載后為什么每次打開總需要置?office2007每次打開都要正在配置?其實不需要重新安裝可…

mysql命令參數_MySQL命令行參數完整版

MySQL命令行參數完整版mysql教程支持下面的選項:---help,-?顯示幫助消息并退出。--batch,-B打印結果,使用tab作為列間隔符,每個行占用新的一行。使用該選項,則mysql不使用歷史文件。--character…

consul 文件夾無法顯示_consul集群搭建參考

1.官網下載安裝包https://releases.hashicorp.com/consul/1.4.3/consul_1.4.3_linux_amd64.zip2.部署節點如下192.168.8.142 sxconsul1192.168.8.143 sxconsul2192.168.8.144 sxconsul33.解壓之后的consul是一個可執行文件,復制到/usr/local/bin/ 下4.三臺服務器創建…

mysql linux環境安裝_MySQL Linux環境的安裝配置

在Kali中已經內置了MySQL(鏡像可以從mysql.com/downloads/ 下載安裝)奇怪的是博主我的kali內置的是mariaDB數據庫,所以我也懶得弄MySQL了!直接mariaDB吧!差不多【PS:據博主所致,mariaDB的操作和MySQL一樣哦!在這后面有…

mysql not in 轉化_[轉]mysql里not in語句怎么寫 | 學步園

使用mysql中經常會遇到的問題,記錄下來轉自: http://database.e800.com.cn/articles/2007/630/1183147360019880660_1.htmlselect bid from board where not in (select bid from favorite)但在mysql里就提示SQL語句的語法不對,“...near sel…

java mysql 事物_java基礎之MySQL事務和視圖

第三節 事務和視圖3.1事務事務是用來維護數據庫完整性的,它能夠保證一系列的MySQL操作要么全部執行,要么全不執行。舉一個例子來進行說明,例如轉賬操作:A賬戶要轉賬給B賬戶,那么A賬戶上減少的錢數和B賬戶上增加的錢數必…

define定義的是什么類型_DEFINE_PROFILE用法介紹(1)

“ 長風破浪會有時,直掛云帆濟滄海!”01—概述可以使用DEFINE_PROFILE定義一個自定義邊界配置文件或單元格區域條件,該條件隨空間坐標或時間而變化。可以自定義的變量如下:速度,壓力,溫度,湍流動能&#xf…

如何判斷輸入的是字符還是數字_[Leetgo]判斷字符串是否為數字

題解分析代碼實現實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。題解分析一個標識數字的字符串可能包括以下字符類型:空格;數組:0~9;正負號小數點冪符號:e/E;為了解決此類問題,需要…

mysql索引優化面試題_mysql索引優化面試題

曾經偷偷的面試了兩個單位,都提到了Mysql的優化問題,所以以后要多多學習數據庫的優化知識了。建設數據庫的優化大概主要就是索引的優化了吧,因為我們不可能修改數據結構的情況下,提高數據庫的查詢效率似乎也只能用索引了。當然這也…

python 可視化大屏幕_如何用python搭建可視化看板?

可視化看板是指大屏 駕駛艙 dashboard這些嗎,如果是,那不建議用python來做,不專業,目前沒有見過哪個項目上的大屏是用python做的,它不是萬能的大屏的制作一般是這樣的先根據用戶的需求,所在的行業&#xff…

mysql語句轉為sql語句_MySQL 的分頁查詢 SQL 語句(轉)

轉自 https://www.cnblogs.com/wbxk/p/10644766.htmlMySQL一般使用 LIMIT 實現分頁。基本語句為:SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...在中小數據量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了索引。舉例…

mysql查詢選課最少成績最高_MySQL 練習

最近在學習MYSQL 數據庫,在此mark 一下做過的sql 相關練習表結構如下:teacher表tidtnameclass表cidcaptioncourse表cidcnameteacher_idstudent表sidgenderclass_idsnamescore表sidstudent_idcourse_idnumclass :teacher : course : student :score : 根…

mysql中nchar_淺談SQL Server、MySQL中char,varchar,nchar,nvarchar區別

1,定義:char: 固定長度,存儲ANSI字符,不足的補英文半角空格。nchar: 固定長度,存儲Unicode字符,不足的補英文半角空格varchar: 可變長度,存儲ANSI字符&…

mysql 5.764_RHEL5.764位源碼編譯安裝MySQL-5.5.42遇到的問題

由于MySQL從5.5之后的版本源碼編譯安裝用cmake, make, make install安裝,不用./Configure,make,make install 安裝,所以要看下系由于MySQL從5.5之后的版本源碼編譯安裝用cmake, make, make install安裝,不用./Configure,make,make install 安裝,所以要看…

java 判斷子類_java判斷class是否是某個類的子類或父類

Class c = ArrayList.class; c.isPrimitive(); //判斷c是否為基本數據類型 c.isAssignableFrom(List.class); //判斷c是否是List類的子類或父類 c.getGenericType(); //得到泛型類型 免費學習視頻分享:java視頻教程 實例:通過反射得到List 集合中的泛型類型package com.zf.ta…

java轉日期_Java時間日期格式轉換

import java.util.*;import java.text.*;importjava.util.Calendar;public classVeDate {/*** 獲取現在時間**return返回時間類型 yyyy-MM-dd HH:mm:ss*/public staticString getNowDate() {Date currentTime newDate();SimpleDateFormat formatter new SimpleDateFormat("…

java 對比工具_Java幾款性能分析工具的對比

在給客戶進行應用程序維護的過程中,我注意到一些關于高負載條件下的性能問題。理論上,增加對應用程序的負載會使性能有所下降,但是我認為性能下降的比率遠遠高于負載的增加,同時我也發現,性能可以通過改變應用程序的邏…

java for循環獲取value_Java遍歷取出Map集合key-value數據的4種方法

將map集合存數據與取出數據全部放在一個類MapTest中,方便閱讀與查看隨便創建一個包,在包中新建一個class文件,(也可以不建包,直接新建一個class文件)新建class文件MapTest.java,代碼如下:import java.util.HashMap;imp…