python文件之上下文管理语句with,python实现上下文管理器
本文介绍了python内置模块的上下文管理contextlib,通过示例代码对其进行了非常详细的介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。
Python当我们打开文本时,我们通常使用with语句。中with语句允许我们非常方便地使用资源而不用担心资源没有关闭。
用open(/路径/文件名, r )作为f:
阅读()
但是,并不是只有open()函数返回的fp对象可以使用with语句。实际上,只要正确实现了上下文管理,任何对象都可以使用with语句。
上下文管理通过两种方法实现:__enter__和__exit__。例如,下面的类实现了这两个方法:
类别查询(对象):
def __init__(self,name):
self.name=name
def __enter__(self):
打印(“开始”)
回归自我
def __exit__(self,exc_type,exc_value,traceback):
如果exc_type:
打印(“错误”)
else:
打印(“结束”)
定义查询(自身):
打印(查询有关%s的信息.% self.name)
这样,我们可以为with语句使用我们自己的资源对象。
查询( Bob )为q:
q.query()
一、@contextmanager
编写__enter__和__exit__还是比较繁琐的,所以Python的标准库contextlib提供了更简单的编写方式。上面的代码可以重写为:
从上下文库导入上下文管理器
类别查询(对象):
def __init__(self,name):
self.name=name
定义查询(自身):
打印(查询有关%s的信息.% self.name)
@上下文管理器
定义创建查询(名称):
打印(“开始”)
q=查询(名称)
产量q
打印(“结束”)
@contextmanager这个装饰器接受一个生成器,用.作为var with yield语句,然后,with语句可以正常工作:
使用create_query(Bob )作为q:
q.query()
很多时候,我们希望在某个代码执行前后自动执行某个特定的代码,也可以使用@contextmanager来实现。
@上下文管理器
定义标签(名称):
打印( %s % name)
产量
打印( % name)
带标签( h1):
打印(“你好”)
打印(“世界”)
上面的代码执行结果:
你好
世界
/h1
代码的执行顺序是:
with语句在yield之前首先执行语句,因此打印出。yield调用将执行with语句中的所有语句,因此打印出hello和world。最后,在yield之后执行该语句将打印出结果
二、@closing
。如果一个对象没有实现context,就不能使用with语句,但是可以使用closing()把对象变成context对象。
从上下文库导入关闭
从urllib.request导入urlopen
关闭(urlopen(https://www.python.org ))作为页面:
对于第:页中的行
打印(行)
关闭也是@contextmanager修饰的生成器。
@上下文管理器
定义关闭(事物):
尝试:
让出东西
最后:
thing.close()
它的功能是把任意对象变成上下文对象,用语句支持。
关于python内置模块contextlib的上下文管理的这篇文章到此结束。希望对大家的学习有所帮助,也希望大家能支持盛行的IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。