Python中上下文管理器有何作用,创建方法是什么
Admin 2022-06-23 群英技术资讯 1217 次浏览
在实际应用中,我们有时候会遇到“Python中上下文管理器有何作用,创建方法是什么”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“Python中上下文管理器有何作用,创建方法是什么”文章能帮助大家解决问题。在Python文件及目录处理方法中介绍了读写大文件建议使用with语句,with语句会进行资源的自动管理。文件很多的情况下也会导致资源泄露,下面来打开100000个文件,不进行文件关闭操作:
for x in range(100000):
file = open('test.txt', 'w')
file_descriptors.append(file)
执行会报如下错误:
OSError: [Errno 24] Too many open files: 'test.txt'
原因就是打开了太多文件而没有及时关闭导致了资源泄露,造成系统崩溃。完成处理后需要对文件进行关闭操作:
file_descriptors = []
for x in range(10000):
file = open('test.txt', 'w')
try:
file_descriptors.append(file)
finally:
file.close()
使用 with 语句可以完成自动分配并且释放资源,比上面的写法更加简洁:
file_descriptors = []
for x in range(10000):
with open('test.txt', 'w') as file:
file_descriptors.append(file)
可以使用类来创建上下文管理器,需要保证这个类包括两个方法:__enter__() 和__exit__()。其中,方法 __enter__() 返回需要被管理的资源,方法 __exit__() 进行资源释放、清理操作。
下面来模拟 Python 的打开、关闭文件操作:
class FileManager:
def __init__(self, name, mode):
print('__init__ method called')
self.name = name
self.mode = mode
self.file = None
def __enter__(self):
print('__enter__ method called')
self.file = open(self.name, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, exc_traceback):
print('__exit__ method called')
if self.file:
self.file.close()
if exc_type:
print(f'exc_type: {exc_type}')
print(f'exc_value: {exc_value}')
print(f'exc_traceback: {exc_traceback}')
return True
with FileManager('test.txt', 'w') as f:
print('开始写操作')
f.write('hello world !')
print(f.closed)
执行结果:
__init__ method called
__enter__ method called
开始写操作
__exit__ method called
exc_type: <class 'Exception'>
exc_value: exception raised
exc_traceback: <traceback object at 0x000001B43C2444C8>
True
可以看到执行顺序为:
__init__():初始化对象 FileManager__enter__():打开文件,返回 FileManager 对象with中的代码
__exit__():关闭打开的文件流
__exit__()方法中的参数exc_type, exc_value, 和 exc_traceback 用于管理异常。
可以使用 contextlib.contextmanager 装饰器而不使用类的方式来实现上下文管理器,它是基于生成器的上下文管理器,用以支持 with 语句。
仍以打开、关闭文件为例:
from contextlib import contextmanager
@contextmanager
def file_manager(name, mode):
try:
f = open(name, mode)
yield f
finally:
f.close()
with file_manager('test.txt', 'w') as f:
f.write('hello world !')
其中 file_manager() 函数是一个生成器,yield 之前可以看成是__enter__方法中的内容,yield 后面的是 __exit__() 内容。加上@contextmanager装饰器,使用基于生成器的上下文管理器时,不需要定义__enter__()和__exit__()方法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
python的安全问题有哪些?本文就给大家来聊一聊python的安全问题,例如输入注入、assert 语句、计时攻击、临时文件等等这些都是什么安全问题呢?如何避免或解决?接下来我们具体的了解看看。
1.获取当前页面的Url方法:current_url实例:driver.current_url 2.获取元素坐标方法:location解释:首先查找到你要获取元素的,然后调用location方法实例:driver.find_element_by_xpath("xpath").location 3.表单的提交方法:submit解释:查找到表单(from)
这篇文章主要介绍了Python if 判断语句,包括流程控制,顺序结构和分支结构,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
本文主要介绍了Python中可以用三种方法判断文件是否存在,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
函数最重要的目的是方便我们重复使用相同的一段程序。将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008