标签:连接 代码块 ext ret def self https script 参考
无论什么编程语言,资源的使用是非常常见的,例如文件操作、数据库连接等。但是这些资源的供应是有限的,因此在使用后要确保释放这些资源。如果这些资源不被释放,可能会因为资源不足导致系统变慢或崩溃。如果有一种自动的机制可以打开和关闭资源将会非常有帮助。其他语言经常使用try-except-finally来实现,python中可以通过上下文管理器实现,最常见的就是with语句进行文件操作了。
with open("out.txt", ‘w‘) as f: f.write("hello, nice to meet you.")
文件描述符(file descriptor)就是一种有限的资源,系统能打开的文件数量是有限制的。
上下文管理器(context managers)可以通过类或函数(生成器、装饰器)来实现。
如果使用类来实现,我们要确保类中包含__enter__()和__exit__()方法。__enter__()方法返回需要被管理的资源,__exit__()方法执行清理操作,不返回任何东西。
class ContextManager(object): def __init__(self): print("init method called.") def __enter__(self): print("enter method called.") return self def __exit__(self, exc_type, exc_value, exc_traceback): print("exit method called.") with ContextManager() as manager: print("do something...")
输出内容:
================================
init method called.
enter method called.
do something...
exit method called.
================================
首先调用init方法初始化,然后调用了enter方法,接着执行with语句中定义的代码块,最后执行exit方法。
从contextlib模块导入contextmanager,在函数定义前添加@contextmanager装饰器。
from contextlib import contextmanager @contextmanager def open_file(filename): f = open(filename, "w") yield f f.close with open_file("out.txt") as f: f.write("new text.")
参考链接:
[1] https://www.geeksforgeeks.org/context-manager-in-python/
[2] https://eastlakeside.gitbooks.io/interpy-zh/content/context_managers/implement_as_generator.html
标签:连接 代码块 ext ret def self https script 参考
原文地址:https://www.cnblogs.com/yunxiaofei/p/11218207.html