python学习笔记之with语句
时间:2019-02-20
本文章向大家介绍python学习笔记之with语句,主要包括python学习笔记之with语句使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、with的应用场景:
在python语言中,with语句适用于资源相关操作,锁相关操作,文件相关操作,异常处理等相关操作情景,可以代替try...except...finally...的模式,让程序员不用写一些可能会忘写的收尾的代码,使代码更简洁。
如下代码:在编码中可能会忘记关闭文件,或者在读取文件时发生异常,没有进行任何处理
import os
if not os.path.exists(u'F:/test'):
os.makedirs('F:/test')
f=open(u'F:/test/text.txt','r+')#打开文件,赋值给句柄
print f.read()#操作句柄读取数据
f.close()#关闭文件
如下代码:对可能出现的异常进行处理,finally关闭文件
import os
if not os.path.exists(u'F:/test'):
os.makedirs('F:/test')
try:
f=open(u'F:/test/text.txt','r+')#打开文件,赋值给句柄
print f.read()#操作句柄读取数据
except:
print 'fail to open'
exit(-1)
finally:
f.close()#关闭文件
为了代码简介,python用with来优雅的处理这段代码
import os
if not os.path.exists(u'F:/test'):
os.makedirs('F:/test')
with open(u'F:/test/text.txt','r+') as f:#打开文件,赋值给句柄
print f.read()#操作句柄读取数据
二、with语句原理
with expression [as target]:
with-body
expression是任意表达式,获取上下文管理器,as target可选,with-body是with语句的语句体
- 计算expression,并获取上下文管理器
- 保存上下文管理器的__exit()__方法
- 调用上下文管理器__enter()__方法
- 如果有as target,__enter()__方法的返回值赋给target
- 执行with语句体的内容,eg:上面打印出利用文件对象读取的文件内容
- 不管是否出现异常,调用第二步保存的上下文管理器的__exit()__方法,这里如果with语句体执行机过程中发生异常导致程序退出,那么异常的type、value、traceback等作为参数传递给__exit()__方法,否则,传递三个None
1、采用装饰器定义上下文管理器:
#coding:utf-8
from contextlib import contextmanager
@contextmanager
def demo():
print '__enter()__'
yield 'contextmangager demo'
print '__exit()__'
with demo() as demo:
print 'with-body: '+demo
__enter()__
with-body: contextmangager demo
__exit()__
2、采用自定义支持closing的对象:
#coding:utf-8
class closing(object):
def __init__(self,thing):
self.thing=thing
def __enter__(self):
print '__enter()__'
return self.thing
def __exit__(self,*exc_info):
print '__exit()__'
self.thing.close()
# 这里closing上下文管理器包装起来的对象必须具有close()方法的定义,否则会报错的
class demo():
def __init__(self):
self.thing=open('C:\Users\***\Desktop\111.txt','w')
def run(self):
print "function running"
def close(self):
self.thing.close()
with closing(demo()) as demo:
demo.run()
__enter()__
function running
__exit()__
3、采用类定义上下文管理器(廖雪峰大神教程的webapp里面就有许多这样的例子)
#coding:utf-8
k=0
m=0
class Sample:
def __init__(self):
global k
k+=1
print k
def __enter__(self):
global k
k+=1
print k
print "__enter__()"
global m
m+=1
return m
def __exit__(self, type, value, trace):
print "__exit__()"
with Sample() as sample:
print sample
1
2
__enter__()
1
__exit__()
这里强调一点:看了许多博客,有的博客里面指出as target操作,是将expression赋值给target,这是不对的,从上面例子可以看出,是将__enter__()方法返回值赋值给target。
- python类中super()和__init__()的区别
- Python正则表达式:最短匹配
- 转--Go时间格式化和类型互换操作
- Python标准库(1) — itertools模块
- Linux笔记:使用Vim编辑器
- 一步一步学lucene——(第二步:示例篇)
- 类属性的延迟计算
- 一步一步学lucene——(第三步:索引篇)
- 在Python应用中使用MongoDB
- Python检查xpath和csspath表达式是否合法
- 一步一步学lucene——(第四步:搜索篇)
- Python爬虫代理IP池
- SSDB图形界面管理工具:phpssdbadmin安装部署
- [Go 语言社区] 初始化内存数据--游戏列表数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 30分钟学会XGBoost
- Linux页框分配器之内存碎片化整理
- 手把手教你实现"短信轰炸"
- 最全总结!聊聊 Python 调用 JS 的几种方式
- 爬取小说网站章节和小说语音播放
- JavaScript原型、原型链及原型链污染
- 报刊订阅管理系统的设计与实现
- 使用Pytest创建一个Python测试自动化项目
- 宾馆客房管理系统的设计与实现
- /leetcode 剑指 Offer 32 - I. 从上到下打印二叉树
- 使用Python和Chrome安装Selenium WebDriver
- 牛客网-从上到下打印二叉树
- leetcode 剑指 Offer 40. 最小的k个数
- 一文了解JDK12 13 14 GC调优秘籍-附PDF下载
- JVM系列之:String.intern和stringTable