python的with語句和上下文管理器初窺

2021-08-02 18:32:55 字數 2366 閱讀 1968

在程式設計中,遇到with語句有好幾次了,一直對with是一知半解,前兩天在看書的時候,突然看到了這個問題,茅塞頓開啊,為了防止以後又塞了,寫個部落格備忘。

程式的上下文我一直不太理解,在看了書之後,得出如此的結論:上下文就是某段**的執行環境。上下文管理器的作用就是在某段**需要執行的時候,給**創造環境,在執行完之後,給收拾了,不要讓那段**老佔著板凳不吃涼粉。上下文管理器和with語句的關係就是with語句可以進入上下文管理器。

python中的有些內建函式帶了上下文管理器,比如open方法,用來開啟檔案,不用with的情況下,在開啟檔案使用後並關閉檔案,正確的方法應該是如下的操作:

try:

f = open('/path/to/filename', 'r')

# do something

finally:

f.close()

不論執行了什麼操作,最後都應該把檔案關掉,這就是finally語句的作用,那麼使用with語句是什麼樣的呢?

with open('path/to/filename', 'r') as f:

# do something

是不是簡潔了很多,在**執行完之後,檔案就關閉了,當然使用的還是close方法,但是open中的上下文管理器替我們做了。

with語句對它後面的**進行求值,就是問後面的語句要乙個返回值,比如這個open,會讓open返回乙個物件,這個物件就包含兩個方法,當然是比較特殊的方法,enter方法和exit方法,enter()方法返回的值會賦給as關鍵字之後的變數。

with語句的作用就是返回乙個遵循特定協議的物件,這個物件必須定義乙個enter和乙個exit方法,而且exit必須接受特定的引數,而enter方法除了self之外,不接受任何引數,enter負責進行一些配置。exit帶有三個位置引數,加上self有四個,如果沒有異常,全部設為none。有一段連線資料庫的**如下,其中寫了上下文管理器。

import psycopg2

class

dbconnect

(object):

def__init__

(self, dbname=none, user=none, password=none, host='localhost', port='5432'):

self.hsot = host

self.port = port

self.dbname = dbname

self.user = user

self.password = password

# __enter__函式,連線資料庫,並且返回游標

def__enter__

(self):

self.connection = psycopg2.connect(

dbname = self.dbname,

host = self.host,

user = self.user,

password = self.password,

port = self.port,

)return self.connection.cursor() #返回乙個游標

# __exit__ 函式,最後斷開連線

def__exit__

(self, exc_type, exc_instance, trackeback):

self.connection.close()

上面的一段**就是乙個上下文管理器,用來連線postgresql資料庫的上下文管理器,使用的時候如下:

with dbconnect(user='username', dbname='database_name') as db:

db.execute('select * from a_sheet')

db.fetchall()

以上的**中,with語句後面的部分,在執行後由上面定義的enter方法返回的游標物件,然後as又將這個游標物件賦值給變數db,然後對資料庫進行乙個操作,當操作完成後,或者操作出現錯誤,總之,無論發生什麼情況,在最後,上下文管理器都會關閉這個連線。

簡言之,上下文管理器就是在使用某些資源的時候開啟,不使用的時候正確並且及時的關閉。

而with語句和上下文管理器的關係就是:with能使用上下文管理器,可以進入上下文管理器。

Python 的條件語句和迴圈語句

一 順序結構 順序結構是最簡單的一種程式結構,程式按照語句的書寫次序自上而下順序執行。二 分支控制語句 python條件語句是通過一條或多條語句的執行結果 true或者false 來決定執行的 塊。python中if語句的一般形式如下所示 if condition 1 statement block...

python的條件語句和迴圈語句

簡單介紹一下python的條件語句和迴圈語句。一 條件語句 if 語句 python中if語句的一般形式如下所示 if condition 1 statement block 1 elif condition 2 statement block 2 else statement block 3 如果...

Python的條件語句和迴圈語句

什麼是條件判斷 1.如果條件滿足,不能做某件事情 如果條件不滿足,就做另外一件事情,或者什麼也不做。2.判斷語句又稱為 分支語句 正是因為有了判斷,才讓讓程式有了很多分支。在程式開發中,一共有三種流程方式 1.順序 從上到下,順序執行 2.分支 根據條件判斷,決定執行 的分支 3.迴圈 讓特定 重複...