∈鱼杆 ---我的鱼塘

执着,坚定,友爱,勇敢(www.pumaboyd.com)Live Message

导航

Python学习笔记三(Try-cacth&with方法)

Posted on 2008-09-08 19:37  ∈鱼杆  阅读(1026)  评论(0编辑  收藏  举报

本来我也是不会特意去寻找Try-catch的替代方法的。但因为在C#中,已经习惯使用using的方式去自动关闭connection。所以就视图在Python中寻找这样的的方式。没想到Python正好有添加,而且貌似就是在Python2.5中添加的这个属性(本人是从2.5开始学习使用的,如有不对还请看客指点)。
先看看Try-Catch的方式是如何处理的
从《简明Python》中引用的代码
try:
    f = file('poem.txt')
    ......
finally:
    f.close()
在Python2.5中你可以这样使用
from __future__ import with_statement
with open('poem.txt', 'r') as f:
    for line in f:
    ......

这样的语法漂亮简洁很多啦。但一定记得要引用from __future__ import with_statement
这句,否则编译器会提示你这个功能在Python2.6实现
那么如何让自己写的类也支持with呢

只要你的类实现了这两个函数就可以了
__enter__()
__exit__()

这里还有一个问题就是,如果这个函数原来没有实现上面两个方式呢。而且目前我知道的,FileObject是有的。像urllib、pymssql这些还没有实现,但它们都一个共性,是通过object.close(),去处理最后一些操作的。

Python为我们也提供了一个with closing的方法:

(代码来自Python2.5文档)
import urllib, sys
from contextlib import closing
with closing(urllib.urlopen('http://www.yahoo.com')) as f:
    for line in f:
        sys.stdout.write(line)
我目前使用的pymssql使用的就是这个方式关闭的。很好很强大。
Python2.5的文档中还提到一种contextlib module的方式:
就是以上两种情况都没了,你怎么使用with。Python也提供了一种方式,
没怎么看明白,但觉的挺麻烦,还不如直接try-catch。所以暂时也不涉及,等发现它的好处在分析。
(*^__^*)。能使用就多使用with吧,代码能优雅不少。