IronPython的第三块鳞片

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

None.gif>>> class  FantasySoft:
None.gifdot.gif     def hello(self):
None.gifdot.gif         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),但是第一种
方式只会得到该类型的超类,大家看以下的代码就会清楚了:

None.gif import System
None.giffrom System.Text import StringBuilder
None.gif
class  FirstStringBuilder( object ):
None.gif    pass
None.gif
class  SecondStringBuilder( object ):
None.gif    pass
None.gif
class  ThirdStringBuilder(FirstStringBuilder):
None.gif    pass
None.gif        
None.gifsb 
=  StringBuilder()       
None.giffsb 
=  FirstStringBuilder()
None.gifssb 
=  SecondStringBuilder()
None.giftsb 
=  ThirdStringBuilder()
None.gif
None.gifprint type(sb), type(fsb), type(ssb), type(tsb)
None.gifprint sb.GetType(), fsb.GetType(), ssb.GetType(), tsb.GetType()
None.gif
None.gifprint type(fsb) 
==  type(ssb)
None.gifprint fsb.GetType() 
==  ssb.GetType()
None.gif
None.gifprint type(fsb) 
==  type(tsb)
None.gifprint fsb.GetType() 
==  tsb.GetType()
None.gif
None.gif

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

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

这样是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剩余空间了。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值