代码改变世界

IronPython的第四块鳞片

2004-09-27 21:57  FantasySoft  阅读(...)  评论(...编辑  收藏
        尽管每天都会关注Jim的blog,关注IronPython的Mail List,但是这几天来都没有什么收获,不仅Jim的blog都快发霉了,Mail List这两三天竟然也没有新的Mail,让我好生失望。看来一切的东西都得靠自己去摸索了,原本想拿着IronPython的源代码研读一番,怎奈天生愚钝,《Code Reading》那本好书又没有带在身上,看代码如同在蜀道行走一般。看来从Python本身入手,并穿插与IronPython的比较或许更加切合我的实际水平了。
        今天先来说一点Python与其他语言不同的地方。Python也和Java一样,号称Everything is Object,但是两者在概念上却是有很大的不同。首先,Java所谓的Everythins is Object就是所有的代码都必须以类的形式出现,而Python则不是,Python可以定义单独定义function,但是每个function却是实实在在的Object。大家看以下的代码:    
>>>def HelloWorld():
     
""" Say "Hello,World"
         Say "Hello,World" again """

>>> print HelloWorld.__doc__         # 这样的调用方式不就是对一个对象中的属性进行访问吗?
        以上仅仅是定义了一个空的函数,但是函数体中包含了该函数的document。一个函数的document string必须出现在函数名称后面的第一行,也就是在函数名与document string之间不能有任何的代码;除此之外,必须使用三个"来定义作为document string的范围。实质上每一个function被定义之后,都会包含许多built-in的属性,__doc__就是其中的一个,以上的代码在解释执行的时候,就会将两个"""之间的字符串赋给__doc__属性。除了__doc__属性之外,一个function还有很多其他的built-in属性,我们可以通过dir(funtion name)来获得。
        以上代码在Python下是没有问题,但是IronPython却让我很是失望,它在Interactive的模式下只能够支持单行的document string,如果像以上的多行的方式,则会陷入一个死循环,直至抛出System. IndexOutOfRangeException: Index was outside the bounds of the array。但是如果将以上代码存为.py文件,通过IronPythonConsole *.py的方式来执行,则是没有问题的。看来IronPython的Interactive方式还存在着很多的bug。同时,通过dir(function name)也可以发现IronPython中的built-in属性并没有与Python完全兼容,缺少了很多属性,同时也增加很多新的属性:如'Call','Equals', 'GetHashCode', 'GetMethod', 'GetType', 'ToString'等。
        今天就先到这里了,大家会不会觉得有点无趣呢?看来我得检讨一下,然后再来点能吸引眼球的了。
        Any proposal is welcome.Thanks!