首页 > 代码库 > 【跟我一起学Python吧】python with statement 进阶理解

【跟我一起学Python吧】python with statement 进阶理解

由于之前有一个项目老是要打开文件,然后用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代码  收藏代码
  1. #!/usr/bin/env python  
  2.   
  3. from __future__ import with_statement   
  4.   
  5. filename = ‘for_test.txt‘  
  6.   
  7. def output(content):  
  8.     print content  
  9.   
  10. #functio solution  
  11. def controlled_execution(func):  
  12.     #prepare thing  
  13.     f = None  
  14.     try:  
  15.         #set thing up  
  16.         f = open(filename, ‘r‘)  
  17.         content = f.read()  
  18.         if not callable(func):  
  19.             return  
  20.         #deal with thing   
  21.         func(content)  
  22.   
  23.     except IOError, e:  
  24.         print ‘Error %s‘ % str(e)  
  25.   
  26.     finally:  
  27.         if f:   
  28.             #tear thing down  
  29.             f.close()  
  30.   
  31. def test():  
  32.     controlled_execution(output)  
  33.   
  34. 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)  

 

方法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)  

 

方法4:

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

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

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

  

    最后总结一下,写这篇文章的目的主要是受了一句话的刺激:“使用语言的好特性,不要使用那些糟糕的特性”!python真是有很多很优雅的好特性,路漫漫其修远兮,吾将上下而求索。。。