赞
踩
# 读写文件的一般方式
def safeFun():
try:
f = open("路径", "r")
r.read()
finally:
if f:
f.close
# 简易版读写方式,不用担心忘记close
def easySafeFun():
with open("路径", "r") as f:
f.read()
# 让老百姓也能使用with的语句
class Query(object):
def __init__(self, name):
self.name = name
# whit语句需要
def __enter__(self):
print("enter")
return self
# whit语句需要
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
print("Error")
else:
print("End")
def query(self):
print("查询信息为 %s" % (self.name))

@contextmanager让我们通过编写generator来简化上下文管理。
运行示例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Python基础 常用内建模块 - contextlib
from contextlib import contextmanager
class EasyQuery(object):
def __init__(self, name):
self.name = name
def query(self):
print("查询信息为 %s" % (self.name))
# @contextmanager这个decorator接受一个generator,用yield语句把with ... as var把变量输出出去,然后,with语句就可以正常地工作了
@contextmanager
def creat_query(name):
print("霸气开始")
q = EasyQuery(name)
# 有yield关键字就表示该函数是generator函数了
# 作为回报 print(b)写成 yield(b)
# 遇到 yield 语句返回
yield q
print("霸气结束")
def easyQueryHaveWitchTest():
with EasyQuery.creat_query("王大锤") as q:
# 运行结果
# 霸气开始
# 查询信息为 王大锤
# 霸气结束
q.query()
easyQueryHaveWitchTest()

运行结果
D:\PythonProject\sustudy>python main.py
霸气开始
查询信息为 王大锤
霸气结束
我们希望在某段代码执行前后自动执行特定代码,也可以用@contextmanager实现
运行示例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Python基础 常用内建模块 - contextlib
from contextlib import contextmanager
# 我们希望在某段代码执行前后自动执行特定代码,也可以用@contextmanager实现
@contextmanager
def tag():
print("----前----")
yield
print("----后----")
with tag():
print("小美")
print("大锤")

运行结果
D:\PythonProject\sustudy>python main.py
----前----
小美
大锤
----后----
代码的执行顺序是:
1. with语句首先执行yield之前的语句,因此打印出print(“—-前—-“);
2. yield调用会执行with语句内部的所有语句,因此打印出 print(“小美”) 和 print(“大锤”) ;
3. 最后执行yield之后的语句,打印出print(“—-后—-“)。
运行示例
closing 让没有对象上下文,变成有对象上下文,从而使用 whith语句
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Python基础 常用内建模块 - contextlib
from contextlib import contextmanager,closing
from urllib.request import urlopen
# closing让没有对象上下文,变成有对象上下文,从而使用 whith语句
with closing(urlopen("https://www.python.org")) as page:
for line in page:
print(line)
具体原理
# closing 的原型如下
@contextmanager
def easyClosing(thing)
try:
yield thing
finally:
thing.close()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。