I am LAZY bones? AN ancient AND boring SITE

2009年 05月 22日 的归档

由gmbox发现了一个python文档的bug

今天lerosua还是说gmbox在他电脑上运行不了,我终于觉得不对劲了,因为在我机器上,已经是没有问题的了.
稍微分析了一下,发现错误是这样的:

  File "/home/leros/work/gmbox/src/lib/parser.py", line 49, in handle_starttag
    if v[n.index('title')]==u'下载':
AttributeError: 'tuple' object has no attribute 'index'

这附近的代码是这样的:

                (n,v)=zip(*attrs)
                if v[n.index('title')]==u'下载':

所以,首先想到的自然是zip这个自建函数,它返回的n和v到底是什么呢?tuple还是list?
于是去查了下官方文档,就发现不对劲了,文档中的例子:

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> zipped
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zipped)
>>> x == x2, y == y2
True

按这样的描述,返回的x2和x应该都是list,但是实践了一下,发现返回的却是tuple…这不乱了吗?于是又跑了一下这个例子,最后一行却不是True,而是(False, False)…就这样发现了文档的一个小错误.
可怜我之前一直非常崇拜python的文档,认为它简直就是文档的典范,详细,可读性也好.现在,突然发现一点瑕疵,不免有些失望呢,TX说也有相同的感觉,哈哈.不过,想想自己能给最喜欢的文档提个bug倒也蛮有成就感的.
python开发也很是活跃,这个bug提交上去以后,仅仅用了15分钟,Georg Brandl就已经把它给干掉了~哈哈,新的文档,最后那里改成了:

>>> x == list(x2) and y == list(y2)
True

于是我也学者这个样子,给我的gmbox加了一行:

                n,v=list(n),list(v)

问题就解决了.
最后,还有一个疑问,为什么之前那样,在python2.5下不行,但是在python2.6下却又不报错呢?
呵呵,答案就是:python2.6给tuple也加了个类似list的index方法…于是歪打正着,在py2.6下,就正确了.