【跟我一起学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:
用函数,把公共的部分抽取出来。
- #!/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 来循环。
代码片段如下:
- #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实现。
代码片段如下:
- #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 的功能。
- def test4():
- with open(filename, 'r') as f:
- output(f.read())
- print f.read()
最后一句print是用来测试f是否已经被关闭了。
最后总结一下,写这篇文章的目的主要是受了一句话的刺激:“使用语言的好特性,不要使用那些糟糕的特性”!python真是有很多很优雅的好特性,路漫漫其修远兮,吾将上下而求索。。。