公网ip做网站,wordpress写入到磁盘,网络推广的基本方法,家装报价单明细表电子版✨前言#xff1a;
#x1f31f;什么是上下文管理器#xff1f;
在Python中#xff0c;上下文管理器是支持with语句的对象#xff0c;用于为代码块提供设置及清理代码。上下文管理器广泛应用于资源管理场景#xff0c;例如文件操作、网络连接、数据库会话等#xff0c…✨前言
什么是上下文管理器
在Python中上下文管理器是支持with语句的对象用于为代码块提供设置及清理代码。上下文管理器广泛应用于资源管理场景例如文件操作、网络连接、数据库会话等其目的是确保如文件或网络会话等资源的正确获取和释放即使在发生异常时也能保证这点。
上下文管理器组成
一个上下文管理器必须实现以下两个魔法方法 enter(self): 进入with语块时执行的方法。__enter__方法的返回值会被with语句的as子句绑定。 exit(self, exc_type, exc_value, traceback): 退出with语块时执行的方法。如果with代码块正常执行完毕exc_type、exc_value和traceback将为None如果抛出了异常这三个参数则用于传递异常信息。
标准库中的上下文管理器
Python的标准库中有许多内置的上下文管理器最常用的是文件操作。例如
with open(example.txt, r) as f:content f.read()print(content)
# 文件会在这里被自动关闭即使读取文件中出现异常也是如此。自定义上下文管理器
要创建自定义上下文管理器你可以定义一个类并实现__enter__和__exit__方法。
下面是一个简单的示例实现了一个会在进入和退出代码块时打印文本的上下文管理器
#!/usr/bin/env python
# codingutf-8# Time : 2024/5/6
# Author : Summer
# File : test
# describe:
class MyContextManager:def __enter__(self):print(Entering the context!)return selfdef __exit__(self, exc_type, exc_value, traceback):print(Exiting the context!)return False # 如果返回True则异常不会被重新抛出否则会被抛出。with MyContextManager() as manager:print(Inside the with statement!)输出
Entering the context!
Inside the with statement!
Exiting the context!使用contextlib模块
Python还提供了一个名为contextlib的模块它允许你使用装饰器或生成器来定义上下文管理器而不是显式地创建一个类。
使用装饰器contextlib.contextmanager可以通过一个生成器函数来创建简单的上下文管理器
#!/usr/bin/env python
# codingutf-8# Time : 2024/5/6
# Author : Summer
# File : test
# describe:
from contextlib import contextmanagercontextmanager
def my_context():print(Entering the context!)try:yieldfinally:print(Exiting the context!)with my_context():print(Inside the with statement!)这会产生与之前自定义类相同的输出。在yield之前的语句相当于__enter__方法在yield之后相当于__exit__方法。
上下文管理器堆叠
在需要管理多个资源的情况下可以堆叠多个上下文管理器
#!/usr/bin/env python
# codingutf-8# Time : 2024/5/6
# Author : Summer
# File : test
# describe:
from contextlib import contextmanagercontextmanager
def open_file(file_name, method):file open(file_name, method)yield filefile.close()with open_file(file1.txt, w) as f1, open_file(file2.txt, w) as f2:f1.write(Hello, file1!)f2.write(Hello, file2!)上下文管理器处理异常
在上下文管理器中处理异常是通过__exit__方法完成的。这个方法有四个参数self、exc_type、exc_val和traceback。如果with代码块在执行过程中没有发生异常exc_type、exc_val和traceback三个参数的值都将是None。如果发生了异常这三个参数则分别代表异常类型、异常值和追踪信息。 exc_type : 异常类型 exc_val : 异常值 exc_tb : 异常回溯追踪 你可以在__exit__方法内部决定如何处理这些异常。如果你想让这个异常被抛出到外层代码你可以返回False如果你处理了异常并不想让它被抛出你可以返回True这样异常就不会传播出去。 下面是一个简单的例子演示如何在上下文管理器中捕获和处理异常
#!/usr/bin/env python
# codingutf-8# Time : 2024/5/6
# Author : Summer
# File : test
# describe:
class MyContextManager:def __enter__(self):print(Entering the context)return selfdef __exit__(self, exc_type, exc_val, traceback):if exc_type is not None:print(fException occurred: {exc_val})return True # 处理了异常阻止异常被抛出print(Exiting the context normally)return False # 未处理异常允许其传播with MyContextManager():print(Inside the with block)raise ValueError(Something went wrong!)print(Outside the with block) # 由于异常被处理这行代码会正常执行输出
Entering the context
Inside the with block
Exception occurred: Something went wrong!
Outside the with block上下文管理器的作用
资源管理 上下文管理器可确保如文件、网络连接和数据库会话等资源被及时且正确地关闭或释放。这对避免资源泄露非常重要。
异常处理 它可以在代码块执行后集中处理在执行过程中可能发生的异常有助于代码的清晰性并减少重复的错误处理代码。
代码清洁 使用上下文管理器可以减少资源管理相关的样板代码量使代码更加简洁、可读。
设置和清理 上下文管理器非常适合执行需要临时设置和随后清理操作的场景例如更改当前目录、更新某些全局设置等。 总的来说上下文管理器提供了一种结构化管理资源和处理异常的优雅方式是Python中编写健壮、清晰和可维护代码的关键工具之一。