mysql with as 用法_Python之图解with语句

v2-f773ab45a73d5359708a10ffad208284_1440w.jpg?source=172ae18b

在我们使用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:BLOCK

v2-c82d32d90d350c5ba863c7a613908503_b.jpg
with语句原理
  1. 执行代码时,先执行 EXPR 语句,生成上下文管理器对象 context_manager;
  2. 获取上下文管理器的 __exit()__ 方法,并保存起来用于之后的调用;
  3. 调用上下文管理器的 __enter__() 方法,且可将返回值赋给as语句变量;
  4. 执行BLOCK中的表达式;
  5. 不管是否执行过程中是否发生了异常,执行上下文管理器的 __exit__() 方法, 执行“清理”工作,如释放资源等。
    1. 如果执行过程中没有出现异常,或者语句体中执行了语句 break / continue / return ,则以 None 作为参数调用 __exit__(None, None, None)
    2. 如果执行过程中出现异常,则使用sys.exc_info得到的异常信息为参数调用 __exit__(exc_type, exc_value, exc_traceback)
  6. 出现异常时,如果 __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 "var"def __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使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实现从键盘上输入学生考试的科目和学生的每科分数,输出总分、最高分、最低分、平均分

java实现从键盘上输入学生考试的科目和学生的每科分数,输出总分、最高分、最低分、平均分 import java.util.Scanner;/*** 从键盘上输入学生考试的科目数和学生的每一科分数 输出总分、最高分、最低分、平均分*/ public class Test08 {public static void main(St…

aidl使用_Android进阶之AIDL如何使用自定义类型

如何在 AIDL 中使用自定义类型,具体步骤如下:创建自定义类型声明自定义类型定义与自定义类型相关的业务重写业务实体类远程调用验证 AIDL1. 创建自定义类型自定义类型传输的就是一个实体对象,这个实体类必须实现 Parcelable 接口,…

java判断一个整数是不是素数(质数)

java判断一个整数是不是素数(质数) /*** 判断一个数是不是素数(质数)* 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。*/import java.util.Scanner;public class Test09 {public static void …

mysql获取时间戳_服了!阿里Mysql三位封神专家总结1200多页性能优化的千金良方...

MYSQL(关系型数据库管理系统)MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relatio…

java输出1-100之间的全部素数

java输出1-100之间的全部素数 public class Test10 {public static void main(String[] args) {int i 2;while (i < 100) {int num 2;boolean flag true;while (num < i) {if (i % num 0) {flag false;}num;}if (flag) {System.out.print(i"\t");}i;}} }…

java生成指定范围的随机数

java生成指定范围的随机数 /*** 如何在程序中生成指定范围的随机数** 生成23-59之间的随机数*/ public class Test11 {public static void main(String[] args) {/*** Math.random() 生成&#xff08;0,1&#xff09;之间的小数&#xff0c;不包括0和1* 所以生成23-59之间的随…

linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验

1)资料下载:点击资料即可下载2)对正点原子Linux感兴趣的同学可以加群讨论&#xff1a;9354467413&#xff09;关注正点原子公众号&#xff0c;获取最新资料更新第四十一章嵌入式Linux LED驱动开发实验上一章我们详细的讲解了字符设备驱动开发步骤&#xff0c;并且用一个虚拟的c…

java模拟回合打怪游戏

java模拟回合打怪游戏 玩家的血值&#xff1a;w 315 怪物的血值&#xff1a;g 500 玩家和怪物互打 玩家每次攻击怪物产生5-8点伤害 怪物每次攻击玩家产生3-5点伤害 采用回合制&#xff0c;一方血量<0游戏结束 用java程序模拟战斗过程&#xff1a;&#xff08;用文字…

cad pu插件下载lisp_CAD自动编号lisp插件下载

点击上方 “CAD自学网 ” → 点击右上角“...” → 点选“设为星标 ★ ”为CAD自学网加上星标&#xff0c;即可及时收到干货啦&#xff01;左下角阅读原文看CAD视频好课推荐&#xff1a;1、CAD2014&#xff1a;点击查看 2、室内&全屋&#xff1a;点击查看 3、CAD2019&am…

java循环的嵌套执行

java循环的嵌套执行 /*** 循环的嵌套执行*/ public class Test14 {public static void main(String[] args) {/*** 外层循环执行一次&#xff0c;内层循环执行多次*/int c 0;int i 1;while(i<10){System.out.println("i的值为&#xff1a;"i);int j 1;while (…

无法启动parallels 缺少必要组件_Parallels 体验 Manjaro 19 (Xfce)

用 Mac Parallels 体验 Manjaro Linux 19个人偏爱Xfce桌面安装时遇到一些问题, 在此快速记录一下启动安装盘时卡住参考资料 Manjaro 19 wont boot with Parallels 151. 按 Crtl Alt F2 进入命令行2. 按提示信息登录3. 安装 video-vesa 驱动sudo mhwd -i pci video-vesa 4. 启动…

java百马百担问题

java百马百担问题 /*** 一百担粮食&#xff0c;用一百匹马一次运走* 大马 一次托4担粮食* 中马 一次托2担粮食* 小马 两匹托1担粮食* 问&#xff0c;三种马各有多少匹* 4d2z1/2x 100*/ public class Test15 {public static void main(String[] args) {//计数变量int i 0;//大…

python百度翻译爬虫_Python爬虫教程-05-python爬虫实现百度翻译

使用python爬虫实现百度翻译功能 python爬虫实现百度翻译&#xff1a; python解释器【模拟浏览器】&#xff0c;发送【post请求】&#xff0c;传入待【翻译的内容】作为参数&#xff0c;获取【百度翻译的结果】 通过开发者工具&#xff0c;获取发送请求的地址 提示&#xff1a;…

java打印直角三角形和倒立直角三角形

一&#xff0c;java打印直角三角形 /*** for循环输出直角三角形*/ public class Test16 {public static void main(String[] args) {for (int i1;i<9;i){for (int j1;j<i;j){System.out.print("*");}System.out.println();}} }执行代码如下&#xff1a; 二&am…

chrome 代理插件_Chrome浏览器拓展插件同步助手

由于很多原因我们在使用Google服务的时候&#xff0c;总是不容易&#xff0c;但是有的时候又绕不开。比如新装Chrome浏览器在没有XXX的情况下如何同步我们已经安装过的插件呢&#xff1f;实在没办法只能一个一个装又太麻烦&#xff0c;所以今天介绍一个可以帮助我们同步插件的拓…

java打印倒立直角三角形

一&#xff0c;java打印倒立直角三角形 /*** java打印倒立直角三角形*/ public class Test18 {public static void main(String[] args) {for (int i1;i<10;i){for (int j1;j<10-i;j){System.out.print("*");}System.out.println();}} }执行代码如下&#xff…

css居中的几种方法_CSS几种常用的水平垂直居中对齐方法

文字的水平垂直居中class"content"> <p>文字水平垂直居中p> </div>.content{ width: 400px; height: 100px; border: #000000 solid 1px;}当前效果&#xff1a;.content{ width: 400px; height: 100px; border: #000000 solid 1px; text-al…

java打印等腰三角形和倒立等腰三角形

一&#xff0c;java打印等腰三角形 package demo01;/*** java打印等腰三角形*/ public class Test20 {public static void main(String[] args) {for (int i 1; i < 10; i) {for (int j 10; j > i; j--) {System.out.print(" ");}for (int j 1; j < 2 *…

java基于ssm的个人博客系统_调研了 100 来个 Java 博客系统,发现这5个最好用

大家好&#xff01;我是 Guide 哥&#xff0c;Java 后端开发。一个会一点前端&#xff0c;喜欢烹饪的自由少年。最近想倒腾一下博客&#xff0c;看了很多现成的比较成熟的开源博客系统&#xff0c;自己也简单从下面几个维度总结对比了一下&#xff1a;star数量技术选型社区生态…

java打印平行四边形

java打印平行四边形 /*** java打印平行四边形*/ public class Test22 {public static void main(String[] args) {for (int i 1; i < 6; i) {for (int j 1; j < 6 - i; j) {System.out.print(" ");}for (int j 1; j < 6; j) {System.out.print("*&…