代码改变世界

IronPython0.9中的Examples

2005-08-29 23:58  FantasySoft  阅读(2317)  评论(2编辑  收藏  举报

        自从IronPython加入了与.NET 2.0一齐发展的行列之后,我的SharpDevelop就不好使了。没有办法,为了能够把IronPython0.9自带的几个Sample跑一跑,花了几天的时间,终于把Visual C# 2005 Express Edition Beta装上了。在聊聊IronPython0.9自带的Example之前,真的忍不住对Visual C# 2005赞叹一番:漂亮的界面,不错的启动速度,对UI开发鬼斧神工般的支持,实在太Cool了!
        抹掉了天花乱坠的唾沫星子,让我们来看看IronPython中的例子吧。在IronPython0.9中自带了两个Example,两个都涉及到了IronPython与C#之间交互的问题。Delegate这个例子主要是说明了在C#中声明了Delegate,而在IronPython文件中定义相应的Event Handler的情况。

public class Counter {
    
public int counter = 0
;
}


public class Walker {
    
public delegate int
 ProcessRegular(XmlNode node);
     
    
public event
 ProcessRegular OnNodeRegular;

    
private int RegularWalk(XmlNode n, Counter cnt) 
{
        cnt.counter
++
;
        
if (OnNodeRegular(n) == 0return 0
;
        
foreach (XmlNode ch in n) 
{
            
if (RegularWalk(ch, cnt) == 0return 0
;
        }

        
return 1;
    }

}

以上是Delegate.cs的部分代码,你会发现这里仅仅是声明了OnNodeRegular,并没有具体的方法体。而实际的方法体则是在IronPython文件中被定义的:

def OnNodeRegular(node):
    print 
"%s, %s, %s" %
 (str(node), str(node.Name), str(node.Value))
    
return 1

w.OnNodeRegular 
+= OnNodeRegular

这里为我们提供了使用Delegate的一种全新的途径:由IronPython去定义被C#代码调用的Event Handler,不同语言的协作性展现无遗。然而,Python不支持方法重载的特性或许会影响function充当Event Handler的通用性。
        而在另外一个例子Embedding中,我竟然没有找到熟悉的.py文件,颇感意外。于是打开其中的一个.cs文件一看,喔,熟悉的IronPython代码都跑到了C#代码中了。原来,Embedding的例子为我们展示了一种在C#中使用IronPython Script的方式。

public class Embed3 {
    
public static int Value = 0
;
    
const string command =

        
"import Embed3                  \n" +
        
"Embed3.Value = 20              \n";

    
public static void Run() 
{
        PythonEngine engine 
= new
 PythonEngine();
        engine.LoadAssembly(
typeof
(Embed3).Assembly);
        engine.Execute(command);
        Console.WriteLine(Value);
    }

}

代码的输出为20,Embed3中Value的值被IronPython Script改变了。这里实现的机制并不神秘,是通过Reflection来改变Value的值。
        关于例子本身,没有太多的东西可以罗嗦的了,毕竟例子只是告诉了我们如何去使用这样的一些特性。 我更愿意去想想这样的例子给我们
带来的启示。两个例子都无一例外的展现了IronPython同C#之间良好的协作性,我不禁开始畅想在未来的Project当中会包含着两种语言,而开发团队也会由IronPython和C#程序员组成,使用不同的语言来开发不同的模块,让语言的优越性得到充分的发挥。也许你会觉得不同语言的协作性在.NET平台早以有之,用得着大惊小怪吗?但是我觉得在项目开发当中,真的会同时使用两种不同的.NET语言吗?C#和VB.NET的协作是IL层面上的,我们并没有办法将VB.NET的代码直接embed到C#的代码中。而在IronPython中,你可以选择将C#的代码Embed到IronPython的代码中(第一个例子),也可以选择将IronPython代码Embed到C#(第二个例子)中,这无疑为开发增加了更多的灵活性。 由于IronPython天生的轻量级特性,在C#代码中嵌入IronPython Script会有效地减少代码量,当然在程序的可维护性方面就可能有所下降了。不管怎么样,IronPython引入了一种新的不同语言的协作机制,也许它会成为你提高编码效率的选择。

PS:IronPython0.9.1在一个星期前,也就是8月23日发布了。期待1.0中……