写过多线程程序的人肯定对各种锁很熟悉,尤其是下面这种代码

def lock_usage:
lock.Lock()
if(...) :
lock.Unlock()
return lock.Unlock()
return

为了避免造成死锁,需要在每个return语句之前都释放锁。像上面的代码中,如果代码的执行路径很多,代码中就会包含大量的unlock语句,代码混乱还是小事儿,如果万一忘掉了unlock,就是个潜在的危险。除了锁之外,包括文件描述符的关闭等涉及到资源释放的操作都会有这种问题。
为了解决内存泄漏的内存问题,现代的编程语言提供了垃圾回收机制。同样为了解决上面这种有限资源的释放问题,很多语言都提供了一些语法特性。Python有with语句,C#有using,Go有defer。

先看解决这种问题的常规做法,使用finally

try:
lock.Lock()
......
except:
prcess_except()
finally:
lock.Unlock

这么写使得代码很乱,尤其是当......处的代码也包含有类似代码时,会使得代码更加混乱。再来看使用with语句后的代码

class LockContext(object):
__init__(self, lock):
self.lock = lock __enter__(self):
self.Lock() __exit__(self, type, value, traceback):
if type != None:
process_except()
self.Unlock()
return false with LockContext(lock) as lock:
.......

这样写出来,代码量虽然差不多,但是结构清晰了很多。在上面的代码中__init__中的赋值是可选的,只要保证能够访问到所需的变量就可。

Python中的with语句中要求对象实现__enter__和__exit__函数。调用with语句时,会先分析该语句,执行__enter__函数,然后在当前suite退出时,会调用__exit__函数。__exit__函数中除了可以做释放资源的操作之外,同时也是异常处理的地方。如果当前suite正常退出,没有抛出任何异常,__exit__的几个参数均为None。否则,则将此异常的type、value、traceback作为参数传递给__exit__函数,同时,如果__exit__返回false,此异常会再次抛出,上一级代码suite可以继续处理,如果__exit__返回true,那么此异常就不会被再次抛出了

Python的with语句的更多相关文章

  1. 理解python的with语句

    Python’s with statement provides a very convenient way of dealing with the situation where you have ...

  2. Python之with语句

    Python之with语句 在Python中,我们在打开文件的时候,为了代码的健壮性,通常要考虑一些异常情况,比如: try: ccfile = open('/path/data') content ...

  3. (Python )控制流语句if、for、while

    这一节,我们将学习Python的控制流语句,主要包括if.for.while.break.continue 和pass语句 1. If语句 if语句也许是我们最熟悉的语句.其使用方法如下: x=inp ...

  4. Python学习教程(learning Python)--3.3.4 Python的if-elif-else语句

    Python的if-elif-else语句用于多种条件判断后选择某个语句块执行.该语句可以利用一系列条件表达式进行检查,并在某个表达式为真的情况下执行相应的代码.需要注意的是,虽然if/elif/el ...

  5. 转: 理解Python的With语句

    Python’s with statement provides a very convenient way of dealing with the situation where you have ...

  6. python的with语句,超级强大

    With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取 ...

  7. 简单探讨python中的语句和语法

    python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了,对象需要靠表达式建立处理,而表达式往往存在于语句 ...

  8. python assert 断言语句的作用

    python assert 断言语句的作用 assert语句的应用场景 使用assert语句是一个很好的习惯. 我们在编写代码的时候, 不知道程序会在什么时候崩溃, 与其让它在深度运行时崩溃, 不如预 ...

  9. Python: 没有switch-case语句

    初学Python语言,竟然很久才发现Python没有switch-case语句 官方的解释说,“用if... elif... elif... else序列很容易来实现 switch / case 语句 ...

随机推荐

  1. 第八十七天请假 PHP smarty模板配置以及简单的调用方式

    smarty模板的配置文件 <?php define("ROOT",str_replace("\\","/",dirname(__FI ...

  2. mysql——第一次学习记的笔记

  3. JavaScript实例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  4. git撤销commit

    请参考该文章:http://www.cnblogs.com/ningkyolei/p/5026011.html 场景: 不小心commit了一个不应该commit的修改,但是还没有push,想撤销那个 ...

  5. 关于Datagridview控件用法的一些总结(设置列chicun)

    1. 关于Datagridview控件用法的一些总结:http://www.cnblogs.com/mingjiatang/p/4968049.html

  6. linux学习之——基础命令

    Linux体系基础命令: Linux是一个命令行组成的操作体系!精华在命令行,岂论图形界面成长到什么水平这个原理是不会变的,Linux命令有许多壮大的效用:从简单的磁盘操作.文件存取.到举办庞大的多媒 ...

  7. C/C++语言的一些精简归纳

    前言:本想直接写个关于OC语言,但觉得还是要说下C先. 先语言特性 C是面向过程的,没有类和对象概念,也就没有什么封装(这个?).继承.多态等特性. 而且是是中级语言,其编译过程包括:预编译(incl ...

  8. Python使用中文注释和输出中文(原创)

    刚开始学习python,需要在Python中注释中文和输出中文,现在开始尝试: 仅为初步学习参考,高手请绕行. -------------------------------------------- ...

  9. [Delphi编译错误]F2084 Internal Error: U2107

    看到这个错误真是头痛,这是一个很旧的项目了,想修改下东西,清理下工程一编译出现这个该死的错误,百度了下,也没解决问题.没办法只好编译所有的BPL了.   这个项目是带包编译的,而且带了几个自己的包. ...

  10. shell 小问题汇总

    写脚本的时候难免会判断变量是否为空或者为定义 变量a未定义 if [ -n $a ];then echo "exists"; else echo "not exists& ...