python中关于with以及contextlib的使用
一般在coding时,经常使用with来打开文件进行文件处理,然后无需执行close方法进行文件关闭.
with open('test.py','r' as f:
print(f.readline())
with的作用,类似于try...finally...,提供一种上下文机制.如果需要使用with语句的类,就必须内部提供了两个内置函数__enter__和__exit__,前者在主体代码前执行,后者在主体代码后执行.看下下面的例子吧.
class Tt:
def output(self):
print('hello,world!')
def __enter__(self):
print('enter!!!')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit!!!')
if exc_type == ValueError:
return True
else:
return False
with Tt() as t:
t.output()
print('do something~~')
print('==================')
with Tt() as e:
raise ValueError('value error!')
print('==================')
with Tt() as e:
raise Exception('can not detect! ')
out:
enter!!!
hello,world!
do something~~
exit!!!
==================
enter!!!
exit!!!
==================
enter!!!
Traceback (most recent call last):
exit!!!
File "/Users/shane/PycharmProjects/Py_study/Base/S12/with_test.py", line 29, in <module>
raise Exception('can not detect! ')
Exception: can not detect!
是不是跟装饰器有点像?再来个contextlib吧!
contextlib是为了加强with语句,提供上下文机制的模块,它是通过Generator实现的。contextlib中的contextmanager作为装饰器来提供一种针对函数级别的上下文管理机制。下面看个例子吧:
import contextlib
free_list=[]
work_thread='alex'
@contextlib.contextmanager
def worker_state(state_list,work_thread):
state_list.append(work_thread)
try:
print('go on!!') #step1
yield #step2
finally:
print(state_list) #step5
state_list.remove(work_thread) #step6
print(state_list) #step7
with worker_state(free_list,work_thread):
print(123) #step3
print(456) #step4
out:
go on!!
123
456
['alex']
[]
contextlib.contextmanager 是python中内置的一个装饰器:执行with后面的函数时,先进入函数中执行,遇到yield时,跳出,执行下面的,最后执行函数中的finally
此种用法也可用来自动关闭socket
import contextlib,socket
@contextlib.contextmanager
def context_socket(host,port):
sk=socket.socket()
sk.bind((host,port))
sk.listen(5)
try:
yield sk #将sk返回,赋值给sock
finally:
sk.close()
with context_socket('127.0.0.1',8888) as sock:
print(sock)
python中关于with以及contextlib的使用的更多相关文章
- Python 上下文管理器模块--contextlib
在 Python 处理文件的时候我们使用 with 关键词来进行文件的资源关闭,但是并不是只有文件操作才能使用 with 语句.今天就让我们一起学习 Python 中的上下文管理 contextlib ...
- Python中操作mysql的pymysql模块详解
Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...
- Python中With的用法
在看Dive Into Python中有关描述文件读写那章节的时候,看到了有关with的用法,查阅下相关资料,记录下来,以备后用. 官方的reference上有关with statement是这样说的 ...
- Python中的上下文管理器和with语句
Python2.5之后引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于规定某个对象的使用范围.本文是针对于该功能的思考总结. 为什么需要上下文管理器? 首先, ...
- (转)Python中操作mysql的pymysql模块详解
原文:https://www.cnblogs.com/wt11/p/6141225.html https://shockerli.net/post/python3-pymysql/----Python ...
- (转)Python中的上下文管理器和Tornado对其的巧妙应用
原文:https://www.binss.me/blog/the-context-manager-of-python-and-the-applications-in-tornado/ 上下文是什么? ...
- python中实现上下文管理器的两种方法
上下文管理器: python中实现了__enter__和__exit__方法的对象就可以称之为上下文管理器 实现方法一举例: def File(object): def __init__(self, ...
- Python中的多线程编程,线程安全与锁(一)
1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...
- 深入浅析python中的多进程、多线程、协程
深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...
随机推荐
- 搭建配置私服-nexus ,Maven中的使用——3
1. 下载nexus包,将bin目录添加到PATH路径下去 2. 修改: bin/jsw/conf 下面的wrapper.conf文件: 修改java命令绝对路径 修改之后: 3. 进入 ...
- mongodb索引 过期索引
过期索引,指的是一段时间后会过期的索引,在索引过期后,相应的数据会被删除,这适合存储一些在一段时间之后会失效的数据,比如用户的登录信息,想要用户登录信息2天后失效,需要用户重新登录,或者存储的日志,希 ...
- springboot的简单了解与使用
1. Spring Boot 1.1. 什么是Spring Boot 1.2. Spring Boot的优缺点 1.3. 快速入门 1.3.1. 设置spring boot的parent <pa ...
- go语言的defer语句
转: https://www.jianshu.com/p/5b0b36f398a2 ---------------------------------------------------------- ...
- java8之Metaspace
HotSpot JVM是java中最常用的java虚拟机.在java8 HotSpot JVM 中,虚拟机的内存模型做了修改调整.以前HotSpot JVM的内存模型分为新生代,老年代,永久 ...
- IIS设置网站为HTTPS并且将HTTP重定向到HTTPS
第一步:下载证书,导入证书到IIS https://help.aliyun.com/knowledge_detail/95502.html 站点绑定https 第二部:安装URL重写模块 rewrit ...
- idea在springboot项目中显示Run Dashboard
1.Run->Edit Configurations 2.在Templates[Defaults]-> Configurations available in Run Dashboard ...
- Sql Server中REPLACE函数的使用
在sql的使用过程当中,我们偶尔会遇到这样一种情况,就是需要改变数据的存储形式,比如数据库某一张表(Info)当中有一个字段Educational(学历),以前存储的是Json数组,现在由于需求的改变 ...
- JQuery实践--插件
jQuery插件的概览http://docs.jquery.com/Pluginshttp://jquery.com/plugins/most_popular 官方的表单插件http://jquery ...
- 018_查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)
#!/bin/bash#使用 netstat -atn 可以查看本机所有连接的状态,-a 查看所有,-t 仅显示 tcp 连接的信息,-n 数字格式显示# Local Address(第四列是本机的 ...