任何物件,只要正確實現了上下文管理,就可以用於with語句。
實現上下文管理是通過enter和exit這兩個方法實現的。例如,下面的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)編寫enter和exit仍然很繁瑣,因此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匯入的才是...