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

时间:2023-11-18 21:09:02

由于之前有一个项目老是要打开文件,然后用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:

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

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

方法2:

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

代码片段如下:

  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. def test2():
  15. for content in controlled_execution():
  16. output(content)

方法3:

用类的方式加上with实现。

代码片段如下:

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

方法4:

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

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

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

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