安丘网站开发,手机网络工具,vs2013 做网站,企业网站推广的策略有哪些在我们使用Python的时候#xff0c;常使用到如下的代码块:# 文件读取
with open(file, r) as f:# CODE BLOCK ## 梯度计算
with tf.GradientTape() as g:# CODE BLOCK #在很多场景中#xff0c;使用with语句来可以让我们可以更好地来管理资源和简化代码#xff0c;它可以看做…在我们使用Python的时候常使用到如下的代码块:# 文件读取
with open(file, r) as f:# CODE BLOCK ## 梯度计算
with tf.GradientTape() as g:# CODE BLOCK #在很多场景中使用with语句来可以让我们可以更好地来管理资源和简化代码它可以看做是对try/finally模式的简化。它原理上是利用了上下文管理器下文简要介绍将对其执行原理和自定义的方法。概念上下文管理协议Context Management Protocol包含方法 __enter__() 和 __exit__() 支持该协议的对象要实现这两个方法。上下文管理器Context Manager支持上下文管理协议的对象这种对象必须实现 __enter__() 和 __exit__() 方法。 上下文管理器定义执行with语句时要建立的运行时上下文负责执行with语句块上下文中的进入与退出操作。 通常使用with语句调用上下文管理器也可以通过直接调用其方法来使用。__enter__() with语句执行时先获取上下文管理器对象随后调用其 __enter__()若有 as var 语句则将返回值赋给变量var可以返回上下文管理器对象本身也可以是其他相关对象__exit__()带有三个参数 exc_type, exc_val, exc_tb若上下文管理器对象执行无异常则三个参数均为 None若发生异常则三个参数分别为 异常类型异常值和tracback信息原理# EXP: 表达式
# VAR: 变量名[as VAR][可选]
# BlOCK: 代码块with EXP as VAR:BLOCKwith语句原理执行代码时先执行 EXPR 语句生成上下文管理器对象 context_manager获取上下文管理器的 __exit()__ 方法并保存起来用于之后的调用调用上下文管理器的 __enter__() 方法且可将返回值赋给as语句变量执行BLOCK中的表达式不管是否执行过程中是否发生了异常执行上下文管理器的 __exit__() 方法 执行“清理”工作如释放资源等。如果执行过程中没有出现异常或者语句体中执行了语句 break / continue / return 则以 None 作为参数调用 __exit__(None, None, None) 如果执行过程中出现异常则使用sys.exc_info得到的异常信息为参数调用 __exit__(exc_type, exc_value, exc_traceback) 出现异常时如果 __exit__(type, value, traceback) 返回 False 则会重新抛出异常让with之外的语句逻辑来处理异常这也是通用做法如果返回True则忽略异常不再对异常进行处理。自定义上下文管理器它使代码更简练可以简化try/finally模式当代码异常产生时__exit__() 会执行清理工作可以对软件系统中的资源进行管理比如数据库连接、共享资源的访问控制等# coding utf-8# 上下文管理器类
class TestWith(object):def __init__(self):passdef __enter__(self):进入with语句的时候被调用并将返回值赋给as语句的变量名print(__enter__)return vardef __exit__(self, exc_type, exc_val, exc_tb):离开with的时候被with调用print(__exit__)return True# with后面必须跟一个上下文管理器
# 如果使用了as则是把上下文管理器的 __enter__() 方法的返回值赋值给 target
# target 可以是单个变量或者由“()”括起来的元组不能是仅仅由“,”分隔的变量列表必须加“()”
if __name__ main:with TestWith() as var:print(var)# 运行结果__enter__
var
__exit__
本例仅对应代码正常执行的流程其他特殊情况不再一一列举有兴趣可单独实验。参考浅谈 Python 的 with 语句 Python中with用法详解 Python中with使用