Python 中的with语句用法

转载于:

http://jianpx.iteye.com/blog/505469

感觉写的不错,抄录下来:

 

由于之前有一个项目老是要打开文件,然后用pickle.load(file),再处理。。。最后要关闭文件,所以觉得有点繁琐,代码也不简洁。所以向python with statement寻求解决方法。

 

在网上看到一篇文章:http://effbot.org/zone/python-with-statement.htm是介绍with 的,参考着例子进行了理解。

 

如果经常有这么一些代码段的话,可以用一下几种方法改进:

代码段:

set thing up

try:

    do something

except :

    handle exception

finally:

    tear thing down

 

案例1:

假如现在要实现这么一个功能,就是打开文件,从文件里面读取数据,然后打印到终端,之后关闭文件。

那么从逻辑上来说,可以抽取“打印到终端”为数据处理部分,应该可以独立开来作为一个函数。其他像打开、关闭文件应该是一起的。

文件名为:for_test.txt

 

方法1:

用函数,把公共的部分抽取出来。

Python代码
 
#!/usr/bin/env python   
  1.   
  2. from __future__ import with_statement    
  3.   
  4. filename = 'for_test.txt'  
  5.   
  6. def output(content):   
  7.     print content   
  8.   
  9. #functio solution   
  10. def controlled_execution(func):   
  11.     #prepare thing   
  12.     f = None  
  13.     try:   
  14.         #set thing up   
  15.         f = open(filename, 'r')   
  16.         content = f.read()   
  17.         if not callable(func):   
  18.             return  
  19.         #deal with thing    
  20.         func(content)   
  21.   
  22.     except IOError, e:   
  23.         print 'Error %s' % str(e)   
  24.   
  25.     finally:   
  26.         if f:    
  27.             #tear thing down   
  28.             f.close()   
  29.   
  30. def test():   
  31.     controlled_execution(output)   
  32.   
  33. test()  
#!/usr/bin/env python

from __future__ import with_statement 

filename = 'for_test.txt'

def output(content):
    print content

#functio solution
def controlled_execution(func):
    #prepare thing
    f = None
    try:
        #set thing up
        f = open(filename, 'r')
        content = f.read()
        if not callable(func):
            return
        #deal with thing 
        func(content)

    except IOError, e:
        print 'Error %s' % str(e)

    finally:
        if f: 
            #tear thing down
            f.close()

def test():
    controlled_execution(output)

test()

 

方法2:

用yield实现一个只产生一项的generator。通过for - in 来循环。

代码片段如下:

Python代码
  1. #yield solution   
  2. def controlled_execution():   
  3.     f = None  
  4.     try:   
  5.         f = open(filename, 'r')   
  6.         thing = f.read()   
  7.         #for thing in f:   
  8.         yield thing   
  9.     except IOError,e:   
  10.         print 'Error %s' % str(e)   
  11.     finally:   
  12.         if f:    
  13.             f.close()   
  14.   
  15. def test2():   
  16.     for content in controlled_execution():   
  17.         output(content)  
#yield solution
def controlled_execution():
    f = None
    try:
        f = open(filename, 'r')
        thing = f.read()
        #for thing in f:
        yield thing
    except IOError,e:
        print 'Error %s' % str(e)
    finally:
        if f: 
            f.close()

def test2():
    for content in controlled_execution():
        output(content)

 

方法3:

用类的方式加上with实现。

代码片段如下:

Python代码
  1. #class solution   
  2. class controlled_execution(object):   
  3.     def __init__(self):   
  4.         self.f = None  
  5.            
  6.     def __enter__(self):   
  7.         try:   
  8.             f = open(filename, 'r')   
  9.             content = f.read()   
  10.             return content   
  11.         except IOError ,e:   
  12.             print 'Error %s' % str(e)   
  13.             #return None   
  14.   
  15.     def __exit__(self, type, value, traceback):   
  16.         if self.f:   
  17.             print 'type:%s, value:%s, traceback:%s' % \   
  18.                     (str(type), str(value), str(traceback))   
  19.             self.f.close()   
  20.   
  21. def test3():   
  22.     with controlled_execution() as thing:   
  23.         if thing:   
  24.             output(thing)  
#class solution
class controlled_execution(object):
    def __init__(self):
        self.f = None
        
    def __enter__(self):
        try:
            f = open(filename, 'r')
            content = f.read()
            return content
        except IOError ,e:
            print 'Error %s' % str(e)
            #return None

    def __exit__(self, type, value, traceback):
        if self.f:
            print 'type:%s, value:%s, traceback:%s' % \
                    (str(type), str(value), str(traceback))
            self.f.close()

def test3():
    with controlled_execution() as thing:
        if thing:
            output(thing)

 

方法4:

用with实现。不过没有exception handle 的功能。

Python代码
  1. def test4():   
  2.     with open(filename, 'r') as f:   
  3.         output(f.read())   
  4.   
  5.     print f.read()  
def test4():
    with open(filename, 'r') as f:
        output(f.read())

    print f.read()

 最后一句print是用来测试f是否已经被关闭了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值