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

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

本来我也是不会特意去寻找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吧,代码能优雅不少。
http://bbs.chinaunix.net/viewthr ... xtra=page%3D1%26amp;filter%3Ddigest 这是原帖
楼主这种人可谓是人中“极品”了,骗积分也拜托你聪明点贴到其他论坛好吧

一看暴露了就把原话编辑掉了,还是有自知之明



QUOTE:
原帖由 thsniperwolf 于 2008-9-8 20:02 发表
http://bbs.chinaunix.net/viewthr ... xtra=page%3D1%26amp;filter%3Ddigest 这是原帖
楼主这种人可谓是人中“极品”了,骗积分也拜托你聪明点贴到其他论坛好吧

实说实说,我没看过这篇帖子。我来这里也不久,刚学习Python。我反正是自己查Python的帮助文档自己找出来的,并且亲自实践。如果我有参考过别人的地方,我也会注明。