posts - 256, comments - 1315, trackbacks - 41, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

IronPython的第三块鳞片

Posted on 2004-09-18 15:54 FantasySoft 阅读(974) 评论(4)  编辑 收藏 所属分类: All About SoftSharp IronPython

        已经两天没有见到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剩余空间了。
 

Feedback

#1楼    回复  引用  查看    

2004-09-18 20:58 by 问题男 [未注册用户]
寒,楼主妙计阿

IronPython——为数不多的可供python爱好者光明正大的将其相关技术贴在专注于.net技术blog的首页的一种技术

说笑,勿怪,呵呵

#2楼    回复  引用  查看    

2004-09-18 21:43 by Fantasy Soft      
老大,您也好几天没有光顾这里了吧?呵呵~~

Python本身就是一个好东东啊,很期待大家都来关注它。而且我个人也比较看好Python乃至与IronPython的发展,毕竟它极大地提高了开发效率。


#3楼    回复  引用  查看    

2004-09-18 22:22 by 问题男 [未注册用户]
是啊,好东西

自从bittorrent出现,我就开始认识这个python并喜欢上了这个东东,只是一直没有去接触他,所以仅能看看热闹了,呵呵

#4楼    回复  引用  查看    

2004-09-19 01:37 by Fantasy Soft      
很早就知道了Python,感觉它真的很cool。或许我对动态语言特别有好感吧,所以我看热闹看了好久,终于还是忍不住去学习了。我觉得在自己的处理问题的工具箱里不仅要有Java、C#这样的主力,更要有C++、C、ASM这样的坚强后盾,也要有Python和Ruby这样称手好用的工具作补充,这就是无坚不摧的“七种武器”了。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-10-14 17:09 编辑过
 
另存  打印
最新IT新闻:
· 雅虎首页大变脸 阿里风格上身
· 万名Linux使用者向暴雪请愿Linux版《Diablo III》
· 56.com我乐网将全面转行 退出视频行业
· Joost借道TOM在线 将正式进军中国
· 微软副总裁公开承认Vista存在问题