IronPython的第五块鳞片
2004-10-12 23:59 FantasySoft 阅读(2002) 评论(1) 编辑 收藏 举报 不知不觉就到了十月份,IronPython这条小蟒蛇也很久没跟大家say Hi了,不过与它老爸Jim从Mail List乃至他的个人blog中消失的时间相比,确实是算不了什么。今天去看了一下Mail List和Jim的blog,很意外的在Mail List中看到了Jim熟悉的名字。
在这篇久违的Message中,Jim也承认自己自从加入了MS之后,很多事情让他费神以致于不能专注到开发中来。同时,也刊出了一个求贤启事,寻求能够参与IronPython开发的程序员,看来IronPython1.0的开发已经提上日程了。在Jim的另外一个Message中,我看到了一个于我而言的新词汇 :LCG(Lightweight Code Generation),而这个新特性则是来自.Net2.0/Whidbey。由于LCG与Reflection相比的一个最大的优势就是,生成的方法所使用的内存是可以被回收的,IronPython1.0中会使用这样的机制去实现代码生成,也就是会在一定程度上替代AssemblyBuilder。有兴趣的话,可以从Mail List中获得更具体的信息。MSDN Blog上还有一篇讲LCG的post。
10月份的Mail List中还提到了不少关于IronPython的bug,譬如in运算符。在IronPython中,in运算符对于两种Python特有的Data type:Dictionary,List而言,实现是OK的,但是对于字符串和Tuple则是存在问题。我们在Interactive的环境下进行测试:
False
>>> t = (1,2,3)
>>> 3 in t
True
>>> 4 in t
False
>>> "s" in t
True
从以上的结果,我们可以发现第一个和最后一个in运算符返回的结果都是有问题的。而这些在CPython下都能得到正确的结果。
细心的你一定会从上面看到三种比较特殊的Data Type:Dictionary,List和Tuple。下面就简单的说说这三种数据类型。首先是Dictionary,它跟HashTable很类似,是由Key/Value pair(键值对)组成,不支持直接的下标形式的访问,但是可以通过key得到相应的value。如下所示:
>>> d["first"]
1
>>> d["third"]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
KeyError: 'third'
当key错误的时候,在CPython下是会有如上的错误信息,IronPython面对这个错误的时候就是无言以对,什么都没有提示,让人莫名其妙。
接着就是List,它跟数组是很类似的,支持直接的下标形式的访问,同时也很容易的访问并生成sub List。如下所示:
>>> l[0]
'first'
>>> l.append("fourth")
>>> l
['first', 'second', 'third', 'fourth']
>>> l.insert(2,"middle")
>>> l
['first', 'second', 'middle', 'third', 'fourth']
>>> l.remove("middle")
>>> l
['first', 'second', 'third', 'fourth']
>>> l[0:2]
['first', 'second']
通过append,insert和remove等方法可以轻松地改变List中的内容,同时通过:运算符也容易得到Sub List,十分的灵活。
最后就是Tuple了,它跟List很象,最重要的不同就是它是Immutable的。同时,访问Tuple的速度要比访问List快,而且,Tuple本身是不可变的,因此Tuple就与Constant类似了。如下所示:
>>> t[0]
'first'
>>> t.append("fourth") // Error
>>> t.remove("second") // Error
上面简要的介绍了一下Python中比较特殊的三种Data Type,有兴趣的朋友可以从Dive Into Python中得到更多的信息。