由于之前有一個項目老是要打開文件,然后用pickle.load(file),再處理。。。最后要關(guān)閉文件,所以覺得有點繁瑣,代碼也不簡潔。所以向python with statement尋求解決方法。以下是開發(fā)筆記。
 
在網(wǎng)上看到一篇文章:http://effbot.org/zone/python-with-statement.htm是介紹with 的,參考著例子進行了理解。
 
如果經(jīng)常有這么一些代碼段的話,可以用一下幾種方法改進:
代碼段:
set thing up
try:
    do something
except :
    handle exception
finally:
    tear thing down
 
案例1:
假如現(xiàn)在要實現(xiàn)這么一個功能,就是打開文件,從文件里面讀取數(shù)據(jù),然后打印到終端,之后關(guān)閉文件。
那么從邏輯上來說,可以抽取“打印到終端”為數(shù)據(jù)處理部分,應(yīng)該可以獨立開來作為一個函數(shù)。其他像打開、關(guān)閉文件應(yīng)該是一起的。
文件名為:for_test.txt
 
方法1:
用函數(shù),把公共的部分抽取出來。
-   
 - from __future__ import with_statement   
 -   
 - filename = 'for_test.txt'  
 -   
 - def output(content):  
 -     PRint content  
 -   
 - def controlled_execution(func):  
 -     
 -     f = None  
 -     try:  
 -         
 -         f = open(filename, 'r')  
 -         content = f.read()  
 -         if not callable(func):  
 -             return  
 -         
 -         func(content)  
 -   
 -     except IOError, e:  
 -         print 'Error %s' % str(e)  
 -   
 -     finally:  
 -         if f:   
 -             
 -             f.close()  
 -   
 - def test():  
 -     controlled_execution(output)  
 -   
 - test()  
 
 
方法2:
用yield實現(xiàn)一個只產(chǎn)生一項的generator。通過for - in 來循環(huán)。
代碼片段如下:
- def controlled_execution():  
 -     f = None  
 -     try:  
 -         f = open(filename, 'r')  
 -         thing = f.read()  
 -         
 -         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實現(xiàn)。
代碼片段如下:
- 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)  
 -             
 -   
 -     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實現(xiàn)。不過沒有exception handle 的功能。
- def test4():  
 -     with open(filename, 'r') as f:  
 -         output(f.read())  
 -   
 -     print f.read()  
 
 最后一句print是用來測試f是否已經(jīng)被關(guān)閉了。
  
    最后總結(jié)一下,寫這篇文章的目的主要是受了一句話的刺激:“使用語言的好特性,不要使用那些糟糕的特性”!python真是有很多很優(yōu)雅的好特性,路漫漫其修遠兮,吾將上下而求索。。。