python 上下文管理器、 else 块、@contextmanager

文章目录

    • 1. else
    • 2. with上下文管理器
    • 3. contextlib模块实用工具
    • 4. @contextmanager 装饰器

learn from 《流畅的python》

1. else

  • for/else、while/else 和 try/else
    前两者 只有在 没有被break 时,才会运行 else
    try 块中没有异常抛出时 才运行 else
for i in range(3):print(i)
else:print("finish, no break")# finish, no breakfor i in range(3):if i == 2:breakprint(i)
else:print("break")# 无输出i = 0
while i < 3:print(i)i += 1
else:print("no break") # no breaki = 0
while i < 3:if i==2:breakprint(i)i += 1
else:print("break") # 无输出arr = [0]
try:arr[0] = 1
except:print("error") # 无输出
else:print("no error, run else")# no error, run elsearr = []
try:arr[0] = 0
except:print("error") # error
else:print("error, will not run else") # 无输出
finally:print("finish") # finish
# finally 子句中的代 码通常用于释放重要的资源,或者还原临时变更的状态

else 这么用的比较少

2. with上下文管理器

上下文管理器协议包含 __enter____exit__ 两个方法

  • with 语句 运行时,会在上下文管理器对象上调用 __enter__ 方法
  • with 语句 结束后,会在上下文管理器对象上调用 __exit__ 方法,以此扮 演 finally 子句的角色(释放重要的资源,或者 还原临时变更的状态),如 关闭文件等
class LookingGlass:def __enter__(self): # 没有其它的参数了import sysself.original_write = sys.stdout.writesys.stdout.write = self.reverse_writereturn 'ABCD'def reverse_write(self, text): # 反转字符串,实现输出self.original_write(text[::-1])def __exit__(self, exc_type, exc_value, traceback):# exc_type 异常类# exc_value 异常实例# traceback 对象# 在 try/finally 语句的 finally 块中调用 sys.exc_info()# 得到的就是 __exit__ 接收的这三个参数import syssys.stdout.write = self.original_writeif exc_type is ZeroDivisionError:print('Please DO NOT divide by zero!')return Truewith LookingGlass() as what:# 进入 __enter__ 函数时返回的 ABCD 字符串存入 whatprint("Michael learning python")# nohtyp gninrael leahciMprint(what)# DCBA
print("Michael learning python")
# Michael learning python
print(what)
# ABCD
manager = LookingGlass()
print(manager)
# <__main__.LookingGlass object at 0x00000231226F2190>
string = manager.__enter__()
print(string)  # DCBA
print(string == "ABCD")  # eurT, 所有的输出经过管理器的 反向输出处理了
print(string == "DCBA")  # eslaF, 所有的输出经过管理器的 反向输出处理了
print(manager)
# >0912F62213200000x0 ta tcejbo ssalGgnikooL.__niam__<
manager.__exit__(None, None, None) # 还原了正常的输出
print(string)  # ABCD

3. contextlib模块实用工具

  • closing 如果对象 提供了 close() 方法,但没有实现 __enter__/__exit__ 协议,那么可以使用这个函数构建上下文管理器
  • suppress, 构建临时 忽略指定异常 的上下文管理器
  • @contextmanager,装饰器 把简单的 生成器函数 变成 上下文管理器,这样就不用创建类去实现管理器协议了
  • ContextDecorator,这是个基类,用于定义基于类的上下文管理器。这种上下文管理器 也能用于 装饰函数,在受管理的上下文中运行整个函数
  • ExitStack,这个上下文管理器 能进入多个 上下文管理器。with 块结束时,ExitStack 按照后进先出的顺序调用栈中各个上下文管理器的 __exit__ 方法。
    如果事先不知道 with 块要进入 多少个上下文管理 器,可以使用这个类。例如,同时打开任意一个文件列表中的所有文件

使用最广泛的是 @contextmanager 装饰 器,因此要格外留心
这个装饰器也有迷惑人的一面,因为它与迭代 无关,却要 使用 yield 语句

4. @contextmanager 装饰器

  • @contextmanager 装饰器能减少代码量,因为 不用编写一个完整的类,定义 __enter__ 和 __exit__ 方法,而 只需实现 有一个 yield 语句的生成器,生成想让 __enter__ 方法返回的值
  • 在使用 @contextmanager 装饰的生成器中,yield 语句的作用是 把函数的定义体分成两部分:
    yield 语句前面的所有代码在 with 块开始时 (即解释器调用 __enter__ 方法时)执行
    yield 语句后面的代码在 with 块结束时(即调用 __exit__ 方法时)执行
import contextlib@contextlib.contextmanager
def looking_glass1():import sysoriginal_write = sys.stdout.writedef reverse_write(text):original_write(text[::-1])sys.stdout.write = reverse_writeyield 'ABCD'  # 产出的值绑定到 as 目标上# 执行 with 块代码时,函数会在这里暂停sys.stdout.write = original_write#  控制权一旦跳出 with 块,继续执行 yield 语句之后的代码with looking_glass1() as what:print("Michael learning python")print(what)
# nohtyp gninrael leahciM
# DCBA
print("Michael learning python")
print(what)
# Michael learning python
# ABCD

其实,contextlib.contextmanager 装饰器会把函数包装成实现 __enter__ 和 __exit__ 方法的

用于原地重写文件的上下文管理器

import csv 
with inplace(csvfilename, 'r', newline='') as (infh, outfh): reader = csv.reader(infh) writer = csv.writer(outfh) for row in reader: row += ['new', 'columns'] writer.writerow(row)

inplace 函数是个上下文管理器,为同一个文件提供了两个句柄(例中的 infh 和 outfh),以便同时读写同一个文件。比标准库中的 fileinput.input 函数 易用

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

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

相关文章

ios 异常捕获

try {autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}}catch (NSException *exception) {NSLog("exception%", exception.description);}finally {} 在ios中经常会使用try catch finally捕获异常, 也可以使用…

andriod studio 运行 无结果_无负压静音供水设备下篇一

1、无负压静音供水设备的安全接地保护a )控制柜的金属柜体上应有可靠的接地保护&#xff0c;与接地点相连的保护导线的截面应符合GB/T3797-2005中4.10.6的规定。与接地点连接的导线必须是黄、绿双色或铜编织线&#xff0c;并有明显的接地标识。a) 主接地点与设备任何有关的、因…

html设置div页面最底,使用css让大图片不超过网页宽度

让大图片不超过网页宽度&#xff0c;让图片不撑破通过CSS样式设置的DIV宽度&#xff01;接下来&#xff0c;我们来介绍下网站在开发DIVCSS的时候会遇到一个问题&#xff0c;在发布一个大图片的时候因为图片过宽会撑破自己设置的div宽度的问题。图片撑破布局原因1、由于浏览器版…

css3列表属性

</head> <!--first-child--给元素中的第一个子表签改变效果--> <style> li:first-child{ background-color:#00F; } /*last-child--给元素中最后一个标签改变效果*/ li:last-child{ background-color:#0F9; } /*li:nth-child()--给指定的位置添加属性&#x…

java上机题四取三排列_java语言特性概述

一.前言 我们都知道java是面向对象的编程&#xff0c;其中四个基本特性&#xff1a;抽象、封装、继承、多态。这四个特性&#xff0c;概括起来可以这么理解&#xff0c;抽象、封装、继承是多态的基础&#xff0c;多态是抽象、封装、继承的表现。二. JAVA 语言特点 a) 跨平台&am…

LeetCode 1984. 学生分数的最小差值

文章目录1. 题目2. 解题1. 题目 给你一个 下标从 0 开始 的整数数组 nums &#xff0c;其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。 从数组中选出任意 k 名学生的分数&#xff0c;使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。 返回可能的 最小差…

django 修改html无变化,Django Pycharm 修改html后立即刷新页面

写项目时需要页面实时刷新&#xff0c;而不是频繁人肉重启项目。测试过dj-static&#xff0c;django-livereload-server&#xff0c;此处使用livereload包,简单好用。仅在debugFalse时生效&#xff0c;不过可以满足调试需求了。安装pip install livereload如果报错&#xff1a;…

C++中vector使用详细说明 (转)

转自&#xff1a;http://blog.chinaunix.net/uid-26000296-id-3785610.html http://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html 一、向量的介绍 向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于…

c++ 一行输出八个数字_R语言笔记(三):数据输入与输出

本文主要介绍数据基本的输入与输出方法&#xff0c;内容包括&#xff1a;1. 数据的输入1.1 scan(), edit(), fix()1.2 调用 R 包自带数据1.3 调用本地数据2. 数据的输出1. 数据的输入1.1 scan(), edit(), fix()手动输入数据主要有以下几种方式&#xff1a;x <- c() # c() 进…

html表单action属性值,HTML中的form表单中的action属性

用户提问在一本书中&#xff0c;在一个处理用户注册的html里&#xff0c;作者把action的值设为"regist.jsp"&#xff0c;如下&#xff1a;function on_submit(){ if (form1.username.value""){ alert("用户名不能为空&#xff0c;请输入用户名&#x…

LeetCode 1985. 找出数组中的第 K 大整数(排序)

文章目录1. 题目2. 解题1. 题目 给你一个字符串数组 nums 和一个整数 k 。 nums 中的每个字符串都表示一个不含前导零的整数。 返回 nums 中表示第 k 大整数的字符串。 注意&#xff1a;重复的数字在统计时会视为不同元素考虑。 例如&#xff0c;如果 nums 是 [“1”,“2”,…

gitosis随记

0、创建git用户 useradd -m git passwd git 1、安装脚本工具&#xff08;gitosis依赖python&#xff09; apt-get install python-setuptools 2、git clone源码 git clone https://github.com/tv42/gitosis.git cd gitosis sudo python setup.py install 3、安装gitosis *id_ds…

firefox应用自动全屏显示_【b】—自动化测试:基础selenium—API

一、浏览器对象# 导入webdriverfrom selenium import webdriver# 创建一个浏览器对象driver webdriver.Firefox()# 设置全屏# driver.maximize_window()# 获取当前浏览器尺寸# size driver.get_window_size()# print(size)# 设置浏览器尺寸driver.set_window_size(400, 400)s…

rn 跳转至html5,ReactNative-从RN端跳转到原生界面

//实现跳转//可以做一次封装&#xff0c;这里只是展示功能AppDelegate *app (AppDelegate *)[[UIApplication sharedApplication] delegate];app.nav.navigationBarHidden NO;[app.nav pushViewController:vc animated:YES];可以这么做的前提就是在app初始化的时候&#xff0…

python 使用期物处理并发

文章目录1. futures.ThreadPoolExecutor2. 期物3. 阻塞型I/O和GIL4. 使用concurrent.futures模块启动进程learning from 《流畅的python》1. futures.ThreadPoolExecutor import os import time import sys import requestsPOP20_CC (CN IN US ID BR PK NG BD RU JP MX PH V…

【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2

BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) &#xff1a;成功返回socket文件描述符&#xff0c;失败返回-1. 参数1&#xff1a;socket对象使用的地址簇或协议簇 常用的有PF_LOCAL(本机通信)、PF_INET(IPv4协议簇)、PF_INET6…

数据库中有痣但是有时取不到_农村这种长得像“泥鳅”的鱼,以前没人吃,现在可能有钱都吃不到...

只说真话的农民公众号原创文章&#xff0c;严禁转载在农村中有很多不能叫出名字的花草和野味&#xff0c;它们当中虽然有些长得比较奇怪&#xff0c;名字也比较奇怪&#xff0c;但是却是非常好的疗补食物。有些花草是治疗疾病的良药&#xff0c;有些野味现在也被搬上了酒桌。但…

简述计算机的英语作文,初中计算机的英语作文

初中计算机的英语作文发布时间&#xff1a;2020-04-07在过去的时间里&#xff0c;计算机得到了很大的改进。下面是小编为大家精心整理的关于初中计算机的英语作文&#xff0c;希望能够帮助到你们。The ComputerThe computer is widely used in all phases of society. In indus…

(第三天)函数

定义函数 关键字function用来定义函数。定义函数有两种方法 &#xff08;1&#xff09;函数定义表达式 1 var f function(x) { return x1; } &#xff08;2&#xff09;函数声明语句 1 function funcname([arg1 [, arg2 [...,argn]]]) { 2 3 } 函数声明语句通常出现在JavaScr…

python 使用 asyncio 包处理并发

文章目录1. 线程与协程对比2. 使用 asyncio 和 aiohttp 下载3. 避免阻塞型调用4. 使用 asyncio.as_completed5. 使用Executor对象&#xff0c;防止阻塞事件循环6. 从回调到期物和协程learn from 《流畅的python》 1. 线程与协程对比 threading import threading import iter…