代码改变世界

IronPython的第六块鳞片(续)

2005-03-31 00:44  FantasySoft  阅读(...)  评论(...编辑  收藏

       在上篇Post中,我提到了IronPython0.7的一个问题:通过key来获取Dictionary类型变量的value,如果key不存在,Console将不会有任何的提示,而CPython则会有相应的KeyError的提示信息。后来,我在IronPython的MessageBoard上发了一个帖子来说明这个问题。结果第二天,IronPython的老爸——Jim Hugunin给予了回复。他认为如果一段代码在IronPython下执行与CPython下执行存在不同,大多数的情况下都会是一个bug。同时,他又提出了另外一个问题,如果Dictionary是.NET的标准数据类型,如Hashtable,那么将会很难处理这种情况。以下是他给出的示例代码:       

>>> from System.Collections import * 
>>> d =
 Hashtable() 
>>> d["exists"= 1
 
>>> d["exists"

1
 
>>> repr(d["missing"
]) 
'None' 

        首先要说明一下repr这个function。它是内建的一个函数,函数的参数是一个object的instance,调用的结果是返回一个String,这个String则描述了instance,类似于常见的toString方法。我们回到示例代码上来,由于d是一个Hashtable,其本质与Dictionary几乎是一致的:都是存放着key/value pair(键值对)。事实上在Hashtable中,通过key去获取相应的值的时候,如果key不存在,并不会产生任何exception,而是返回一个null。那么,这样反映出来的对象行为与Dictionary就会有不同的地方。Jim的言下之意是,给出一个KeyError的提示不难,但是难就难在,引入了这些在.NET下才有的对象,如何去定义这些对象在IronPython下的行为,是继续保持它们在.NET下的行为呢?还是对它们的行为进行改造,以适合Python的环境呢?Jim认为这个问题是十分重要的,用他的一句话来说明就是:Figuring out the right behavior for these kinds of foreign types in IronPython is one of the bigger interesting design questions.