一般在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的使用的更多相关文章

  1. Python 上下文管理器模块--contextlib

    在 Python 处理文件的时候我们使用 with 关键词来进行文件的资源关闭,但是并不是只有文件操作才能使用 with 语句.今天就让我们一起学习 Python 中的上下文管理 contextlib ...

  2. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  3. Python中With的用法

    在看Dive Into Python中有关描述文件读写那章节的时候,看到了有关with的用法,查阅下相关资料,记录下来,以备后用. 官方的reference上有关with statement是这样说的 ...

  4. Python中的上下文管理器和with语句

    Python2.5之后引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于规定某个对象的使用范围.本文是针对于该功能的思考总结. 为什么需要上下文管理器? 首先, ...

  5. (转)Python中操作mysql的pymysql模块详解

    原文:https://www.cnblogs.com/wt11/p/6141225.html https://shockerli.net/post/python3-pymysql/----Python ...

  6. (转)Python中的上下文管理器和Tornado对其的巧妙应用

    原文:https://www.binss.me/blog/the-context-manager-of-python-and-the-applications-in-tornado/ 上下文是什么? ...

  7. python中实现上下文管理器的两种方法

    上下文管理器: python中实现了__enter__和__exit__方法的对象就可以称之为上下文管理器 实现方法一举例: def File(object): def __init__(self, ...

  8. Python中的多线程编程,线程安全与锁(一)

    1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...

  9. 深入浅析python中的多进程、多线程、协程

    深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...

随机推荐

  1. django 搜索引擎 Elasticsearch 安装使用

    1.使用docker安装elasticsearch a.获取镜像 # 拉取镜像到本地仓库 # docker image pull delron/elasticsearch-ik:2.4.6-1.0 由 ...

  2. Octave(1)

    size(A)返回矩阵A的大小: >> A=[ ; ; ]; >> size(A) %返回矩阵A 的大小 ans = >> size(A,) %返回A的第一维度大小 ...

  3. AcWing 246. 区间最大公约数

    246. 区间最大公约数 思路: 首先根据更相减损术,我们得到一个结论: \(gcd(a_l, a_{l+1}, ...,a_r) = gcd(a_l, a_{l+1}-a_l, a_{l+2}-a_ ...

  4. hive中计算某个日期是星期几的算法

    pmod(floor((unix_timestamp('2019-06-11 00:00:00')-unix_timestamp('1970-01-05 00:00:00'))/(3600*24)), ...

  5. java8的相关特性

    1,为什么要介绍java8的相关特性? 因为现在的企业大部分已经从java7向java8开始迈进了,用java8的公司越来越多了,java8中的一些知识还是需要了解一些的; java8具有以下特点: ...

  6. MongoDB常用语句大全

    原文出处:https://www.cnblogs.com/--smile/p/11055204.html 直接输入mongo进入数据库 查询操作 查看当前数据库版本 db.version() //4. ...

  7. activemq的配置与结合spring使用

    其实无论在win下还是在linux下,都可以运行得很爽 下载安装包地址: http://www.apache.org/dyn/closer.cgi?path=/activemq/5.12.1/apac ...

  8. spring 使用 context:property-placeholder 加载 多个 properties

    一般使用PropertyPlaceholderConfigurer来替换占位符,例如: <bean class="org.springframework.beans.factory.c ...

  9. Mysql建表+创建索引

    创建表时可以直接创建索引,这种方式最简单.方便.其基本形式如下: CREATE TABLE 表名( 属性名 数据类型[完整性约束条件], 属性名 数据类型[完整性约束条件], ...... 属性名 数 ...

  10. Codeforces 1272 A-E

    Codeforces 1272 A-E A Three Friends 直接枚举所有情况,共\(3\times 3\times 3=27\)种. code #include<bits/stdc+ ...