IronPython的第三块鳞片
2004-09-18 15:54 FantasySoft 阅读(1698) 评论(4) 编辑 收藏 举报 已经两天没有见到IronPython那条小蟒蛇,你想念它了吗?今天就再跟大家说说它的事情吧。由于IronPython的老爸Jim的blog半天都不会更新一次,Mail List就成为所有的信息的来源了。9月份的Mail依旧热闹,而且很多热心的程序员对一些bug给出了自己的解决办法。
1、对于Interactive方式下class的定义,如下
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),但是第一种方式只会得到该类型的超类,大家看以下的代码就会清楚了:
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__属性了具体方式如下:
>>>s = 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剩余空间了。