代码改变世界

IronPython的第五块鳞片

2004-10-12 23:59  FantasySoft  阅读(...)  评论(...编辑  收藏

        不知不觉就到了十月份,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的环境下进行测试:

>>> "ab" in "abc"
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,"second":2}
 >>> d["first"]
 1


>>> d["third"]
Traceback (most recent call last):
  File 
"<stdin>", line 1in ?

KeyError: 
'third'

当key错误的时候,在CPython下是会有如上的错误信息,IronPython面对这个错误的时候就是无言以对,什么都没有提示,让人莫名其妙。
        接着就是List,它跟数组是很类似的,支持直接的下标形式的访问,同时也很容易的访问并生成sub List。如下所示:
>>> l = ["first""second""third"]
>>> 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 = ("first""second","third")
>>> t[0
]
'first'


>>> t.append("fourth"// Error
>>> t.remove("second"// Error

        上面简要的介绍了一下Python中比较特殊的三种Data Type,有兴趣的朋友可以从Dive Into Python中得到更多的信息。