代码改变世界

IronPython的第三块鳞片

2004-09-18 15:54  FantasySoft  阅读(...)  评论(...编辑  收藏

        已经两天没有见到IronPython那条小蟒蛇,你想念它了吗?今天就再跟大家说说它的事情吧。由于IronPython的老爸Jim的blog半天都不会更新一次,Mail List就成为所有的信息的来源了。9月份的Mail依旧热闹,而且很多热心的程序员对一些bug给出了自己的解决办法。
        1、对于Interactive方式下class的定义,如下

>>> class FantasySoft:
     def hello(self):
         print 
"Hello,world!"

会抛出System.Reflection.TargetException: Non-static field requires a target。这个bug在IronPython的第一块鳞片(补充)中有提及。一位程序员给出了解决的办法:将IronPython/Object下面的module.cs中的124行return fi.GetValue(null) 改为return fi.GetValue(this) 即可。我兴高采烈的尝试去编译IronPython整个project的时候,结果一个error蹦了出来:The name SystemUtils.IdentityHashCode could not be found in IronPython. Objects. Ops。我差点没跌破眼镜,怎么会有这样的错误呢?搜索了半天,只是发现了在Mono下面编译也会出现这样的错误。后来猛地想起了一个重要的文档没有看,就是IronPython自带的readme,赶紧查看了一下,原来如果要重新编译IronPython,就要增加对SystemUtil.dll的引用,这个.dll文件就在bin目录下。赶紧在SharpDevelop中增加了对SystemUtil.dll的引用,编译通过了!接着试了一下原来抛出异常的代码,一切正常!当然通常修改了一个bug都有可能带来新的bug,因此还不能保证这样的改动会不会对其他部分产生影响;
        2、在IronPython下可以通过两种方式得到一个对象的类型:variable.GetType()和type(variable),但是第一种
方式只会得到该类型的超类,大家看以下的代码就会清楚了:

import System
from System.Text import StringBuilder
class FirstStringBuilder(object):
    pass
class SecondStringBuilder(object):
    pass
class ThirdStringBuilder(FirstStringBuilder):
    pass
        
sb 
= StringBuilder()       
fsb 
= FirstStringBuilder()
ssb 
= SecondStringBuilder()
tsb 
= ThirdStringBuilder()

print type(sb), type(fsb), type(ssb), type(tsb)
print sb.GetType(), fsb.GetType(), ssb.GetType(), tsb.GetType()

print type(fsb) 
== type(ssb)
print fsb.GetType() 
== ssb.GetType()

print type(fsb) 
== type(tsb)
print fsb.GetType() 
== tsb.GetType()

对以上代码说明一下,后面四个布尔表达式的值分别为False,True,False和True。因此只有使用type才能得到对于对象类型最准确的描述。还有一种在Interactive方式下得到类型的方式,就是使用内建的__name__属性了具体方式如下:

>>>from System.Text import *
>>>= StringBuilder
>>>s.__name__

这样是OK的,但是如果将第二行代码改为s = StringBuilder(),则会抛出异常Unhandled Exception: IronPython. Objects. PythonAttributeError: 'System.Text.StringBuilder' object has no attribute '__name__'。而且这种方式在script中不管使用s = StringBuilder还是s = StringBuilder()都会抛出异常,着实是不稳定。
        3、在IronPython下可以通过内建的方法globals()得到一个已经创建的Object的list,但是在Python中,还可以使用globals().values()仅仅列出值而不包括变量名,但是在IronPython下利用这种方式则会出现致命的错误:Fatal stack overflow error.从而导致整个程序退出。
        今天就先到这里了,有兴趣的朋友可以访问Mail List获得更多的信息。        
        
        PS:Sharp Develop还是挺好用的,至少它的简洁深得我心。而且还有一个关键的功能是能够将VS.NET下的solution进行导入,省去了安装VS.NET这个庞然大物的烦恼,我的硬盘就只剩下可怜的1G剩余空间了。