Python常用內建模組之contextlib

2021-08-14 15:13:00 字數 2550 閱讀 4631

任何物件,只要正確實現了上下文管理,就可以用於with語句。

實現上下文管理是通過enterexit這兩個方法實現的。例如,下面的class實現了這兩個方法:

class

query

(object):

def__init__

(self, name):

self.name = name

def__enter__

(self):

print('begin')

return self

def__exit__

(self, exc_type, exc_value, traceback):

if exc_type:

print('error')

else:

print('end')

defquery

(self):

print('query info about %s...' % self.name)

with query('bob') as q:

q.query()

執行結果:

"c:\program files\python36\python.exe"

c:/users/administrator/pycharmprojects/python全網練習/常用內建模組.py

begin

query info about bob...

endprocess finished with exit code 0

1)編寫enterexit仍然很繁瑣,因此python的標準庫contextlib提供了更簡單的寫法,上面的**可以改寫如下:

from contextlib import contextmanager

class

query

(object):

def__init__

(self, name):

self.name = name

defquery

(self):

print('query info about %s...' % self.name)

@contextmanager

defcreate_query

(name):

print('begin')

q = query(name)

yield q

print('end')

with create_query('bob') as q:

q.query()

執行結果:

"c:\program files\python36\python.exe"

c:/users/administrator/pycharmprojects/python全網練習/常用內建模組.py

begin

query info about bob...

endprocess finished with exit code 0

2)很多時候,我們希望在某段**執行前後自動執行特定**,也可以用@contextmanager實現。例如:

from contextlib import contextmanager

@contextmanager

deftag

(name):

print("<%s>" % name)

yield

print("" % name)

with tag("h1"):

print("hello")

print("world")

執行結果:

"c:\program files\python36\python.exe" c:/users/administrator/pycharmprojects/python全網練習/常用內建模組.py

process finished with

exit code 0

如果乙個物件沒有實現上下文,我們就不能把它用於with語句。這個時候,可以用closing()來把該物件變為上下文物件。例如,用with語句使用urlopen():

from contextlib import contextmanager

from contextlib import closing

from urllib.request import urlopen

@contextmanager

defclosing

(thing):

try:

yield thing

finally:

thing.close()

with closing(urlopen('')) as page:

for line in page:

print(line)

Python常用內建模組之collections

collections是python內建的乙個集合模組,提供了許多有用的集合類。1.namedtuple namedtuple是乙個函式,它用來建立乙個自定義的tuple物件,並且規定了tuple元素的個數,並可以用屬性而不是索引來引用tuple的某個元素。這樣一來,我們用namedtuple可以很...

Python常用內建模組之json

json資料就是遵循一種格式的文字資料,用來使 標準化,前後端互動最好的資料格式之一。json資料就是個字串,可以表示python中的資料,比如可以把dict,list等資料統統轉化成json字串,方便交流。json模組四種常用方式 帶s的 json.loads 把json字串轉化為python資料...

python 常用內建模組之datetime

from datetime import datetime now datetime.now print now out 2019 02 06 15 08 10.618082datetime模組裡還包含了乙個datetime類,通過from datetime import datetime匯入的才是...