Archive for 八月, 2008

异常vs.判断

这两天python-list上有条关于什么时候用异常的讨论线索,在这

不长,稍微整理了一下。

几个缩写语:

  • EAFP: Easier to ask forgiveness than permission
  • LBYL: Look before you leap
  • DFTCFE: Don’t forget to check for errors

异常的一些好处:

try:
    x = 3 / y
except ZeroDivisionError:
    x = 0

if y != 0:
    x = 3 / y
else:
    x = 0

如果除以0的操作出现得不频繁的话,速度上异常会快一点,因为它少了一步判断操作。

if os.path.exists(filename):
    f = open(filenmae)

上面的代码中,在if判断和open函数打开文件之间,可能文件被删除,从这一点上说,异常更加保险。

如果我们乘坐google这架时光机器,我们还可以去旁听一下2003年的那场讨论

如果耐心看下去,你会看到如下代码,哈。

try:
    igniteKerosene()
except ExplosionError:
    handleExplosionCase()

Comments

screen下让vim支持鼠标

只需在vim中进行如下设置即可:

set ttymouse=xterm2

但是鼠标滚轮依然无法使用,只能下滚,不能上滚,继续google中。

Comments

vimxmms2: vim’s xmms2 client

其实vimxmms2这个插件我很早就写了,也写过一篇介绍,但由于当时xmms2还刚刚起步,并不稳定,而我也没怎么用xmms,所以一直没有传到vim.org上。

现在重新拿起xmms2,于是就把这插件的代码整理了一下,并加了些注释和文档,放到vim.org上了,有兴趣的可以下来玩玩。

地址在这

Comments

学习Python: enumerate

以前为在遍历一个列表的同时得到索引号,我会这样做:

for i in range(len(alist)):
    print i, alist[i]

但利用enumerate,可以这样:

for i, x in enumerate(alist):
    print i, x

这是在Python2.3中加入的,关于为什么加入这个builtin函数,以及它的一些取舍,甚至为什么取这个名字,这一系列问题都可以从PEP 279中找到答案。

Comments

学习Python: dict.iterkeys vs dict.keys

Python的字典容器有三个iter*的方法,除iterkeys外,还有iteritems, itervalues,之前我一直没注意到还有这些函数。从名字就可以看出来,它们和keys, items, values的区别,前者返回递代器,而后者返回列表。但既然有了iter*了,那返回列表的那些函数为什么还存在呢?不是list(d.iterkeys())转化一下就可以了吗?这不是Python的风格啊?

问问google,发现这个问题在Python3.0中已经解决了,也就是去除了d.iter*这几个函数,再把d.keys, d.items, d.values的功能改为原先d.iter*的功能。GvR的建议是现在一律用d.iter*,这样在需要从Python2.x转移到3时候,只用2to3这个工具转化一下就可以了。具体看GvR的这个PPT: Python 3000 and You

这个我好像无法追溯到源头,看来这个想法是由来已久啊。当然pep-3100上肯定是提到了。不过还是有不一样的声音,这里就有非常激烈的讨论,有空看一下。

Comments

学习Python: defaultdict

defaultdict是Python2.5新加入的一个容器,在collections模块中。至于这个有什么功用,可以看一下GvR最初的Proposal。那个Thread很长,看了几条回复就再没耐性看下去了,直接跳到GvR的阶段性总结,其实大概也是最终版本了,因为我找不着GvR在后续邮件中再有长篇大论了。当然那只是Proposal,最终实现还是要看文档和代码。

插曲:当我正纳闷怎么没有PEP时,看到这么一段:

Fredrik Lundh fredrik at pythonware.com
Fri Feb 17 14:16:59 CET 2006

> I would like to add something like this to the collections module, but a PEP is
> probably needed to deal with issues like:

frankly, now that Guido is working 50% on Python, do we really have to use
the full PEP process also for simple things like this?

I'd say we let the BDFL roam free.

(if he adds something really lousy, it can always be tweaked/removed before
the next final release.  not every checkin needs to be final...).

言归正传,其实上面只是defaultdict的历史,看与不看关系不大,关键还是看文档,Python的文档一向是我最欣赏的地方:)。具体位置在这

呃~发现没啥好解释的了,文档加上紧随其后的Example应该已经讲解得非常详细了。其实就是在创建字典时给字典提供一个默认值(精确一点是一个factory,也就是一个函数,调用一下产生一个默认值),之后你就放心大胆地去用key来索引那字典吧,如果找不到这个key,defaultdict会调用factory产生一个值并赋给key。

Comments

« Previous entries