首页 > 代码库 > python的with
python的with
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源。
比如文件使用后自动关闭、线程中锁的自动获取和释放等。
with open(‘test.txt‘, ‘r‘) as f: for line in f: print(line)
运行机制
with VAR = EXPR:
BLOCK
等价于
VAR = EXPR VAR.__enter__() try: BLOCK finally: VAR.__exit__()
VAR对应一个上下文管理器(context manager)。
上下文管理器
实现了__enter__()和__exit__()两个方法的类就是一个上下文管理器。
class MyContextManager: def __enter__(self): print(‘before block run‘) def __exit__(self, exc_type, exc_val, exc_tb): print(‘after block run‘)
使用上下文管理MyContextManager
with MyContextManager(): print(‘run block‘)
输出如下:
before block run
run block
after block run
MyContextManager也可以接受参数
class MyContextManager: def __init__(self, name, age): self.name = name self.age = age def __enter__(self): print(‘before block run‘) return self def __exit__(self, exc_type, exc_val, exc_tb): print(‘after block run‘) def show(self): print(‘my name is:‘, self.name) print(‘my age is:‘, self.age)
再次使用上下文管理MyContextManager
with MyContextManager(‘logan‘, 27) as myCM: myCM.show()
输出如下:
before block run
my name is: logan
my age is: 27
after block run
这里用到了一个as: with context_manager as target
target对应context_manager的__enter__()方法的返回值,返回值可以是context_manager自身,也可以是其他对象。
contextlib.contextmanager
python的with
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。