zoukankan      html  css  js  c++  java
  • Python中with的用法

    在Python中,with语句的目的是简化try/finally的模式,使得代码可以保证运行完毕后执行某一项操作,哪怕是发生了异常、return等调用而终止,也一定会执行指定的操作。为了使代码可以使用with语句,with语句中的类必须实现__enter__和__exit__两个方法,分别在with语句开始运行前和执行后运行。
    比如我们平常用得最多的用法:

    with open('mirror.py') as fp:
        src = fp.read(60) 
    

    读取文件用的就是with语句,open返回一个文件类型TextIOWrapper,传值给fp。可以对fp执行读取文件操作,当出现异常时会执行TextIOWrapper的__exit__方法。
    下面看一个更复杂的例子,摘抄自《流畅的Python》,虽然这段代码我试过在Python2.7中无法运行(由于无法更改stdout.write)函数,但可以一窥其中的思想:

    class LookingGlass:
        def __enter__(self):
    	import sys
    	self.original_write = sys.stdout.write
    	sys.stdout.write = self.reverse_write
    	return "Jacy"
    	
        def reverse_write(self, text):
    	self.original_write(text[::-1])
    	
        def __exit__(self, exc_type, exc_value, traceback):
    	import sys
    	sys.stdout.write = self.original_write
    	if exc_type is ZeroDivisionError:
    	    print "zero division error"
    	    return True
    
    with LookingGlass() as what:
        print "El psy congroo"
        print what
    print what
    

    按照书中的解释,在LookingGlass对象__enter__时,将Python输出的函数予以替换,这样可以将输入的文字全部倒置;然后with语句中输出的所有文本就都是倒置的。在__exit__时再将输出流设定回初始值。其中__enter__的返回值就是what,因此两次输出what分别是“ycaJ”和“Jacy”。
    最后在__exit__函数中可以处理with块的异常情况,比如上面的示例代码就处理了ZeroDivisionError的情况。该函数返回True代表异常被正确地处理,否则会将异常继续抛出。

  • 相关阅读:
    技术的那些事儿_2_产品与工艺
    for与foreach再探讨
    技术的那些事儿_3_西方技术管理的精髓
    搭建免费的.Net开发环境
    CDN
    servu 系统服务看门狗,自动脱机补丁,自动启动
    .NET Remoting程序开发入门篇
    网管必知远程终端3389端口合理修改秘藉
    反射方法调用时的一个错误:参数计数不匹配( parameter count mismatch )
    VPS性能测试第一步:CPU测试
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/12804822.html
Copyright © 2011-2022 走看看