2012-08-17 36 views
1

我使用Iron Python作为免费的附加工具来测试将通信包装到某些定制硬件的API,以便非开发团队可以通过python与硬件一起玩。使用来自IronPython的可变参数调用CLR方法

但是我无法弄清楚如何让.NET void func(params object[] args)映射到Python def (*args)

这里有一些代码来解释。

我有一个类型,允许注入日志回调格式和处理消息是在Console.WriteLine和Debug.WriteLine的签名之后。

public class Engine 
{ 
    Action<string, object[]> _logger; 
    public void Run() 
    { 
     Log("Hello '{0}'", "world"); 
    } 
    public void SetLog(Action<string, object[]> logger) 
    { 
     _logger = logger; 
    } 
    void Log(string msg, params object[] args) 
    { 
     _logger(msg, args); 
    } 
} 
在我的IronPython代码

import clr 
from System import * 
from System.IO import Path 
clr.AddReferenceToFileAndPath(Path.GetFullPath(r"MyAssembly.dll")) 
from MyNamespace import * 

def logger(msg, *args): 
    print(String.Format(msg, args)) 
    print(String.Format(msg, list(args))) 
    print(String.Format(msg, [args])) 
    a=[] 
    for i in args: 
     a.append(i) 
    print(String.Format(msg, a)) 

e = Engine() 
e.SetLog(logger) 
e.Run() 

输出

Hello '('world',)' 
Hello 'IronPython.Runtime.List' 
Hello 'IronPython.Runtime.List' 
Hello 'IronPython.Runtime.List' 

我想

Hello 'world' 
+0

可能重复array](http://stackoverflow.com/questions/1107789/assigning-a-iron-python-list-to-net-array) – 2012-08-17 12:54:53

+0

如果它是该职位的副本那么要么我不明白我自己的问题或者我不理解他们的(或两者:-) – 2012-08-17 13:17:14

+0

我认为@HansPassant引用的问题不是一个硬复本,而是暗示其中一个可能的解决方案(请参阅我的答案和答案rsion到'Array [object]')。 – 2012-08-19 12:28:27

回答

2

因为String.Format处理您的铁Python对象(元组的第一输出的情况下,列出最后三个)作为单个对象,并不知​​道你希望Python集合被用作params object[],你会得到意想不到的输出。调用def logger时,隐式创建单个python对象/元组。

根据你的实际用例/风格,你可以用不同的方式解决这个问题。

最蟒蛇-Y方式将在他们的调用点像杰夫被扩大的争论在他的回答解释说:

def logger(msg, *args): 
    print(String.Format(msg, *args)) 

如果你打电话logger只能从CLR的执行Action<string, object[]>,你可以只是argsobject[]类型的单(不变量)的说法一样

def logger(msg, args): 
    print(String.Format(msg, args)) 

如果你想打电话logger由使用可变参数以及蟒蛇(和你不介意的话,你可以做

def logger(msg, *args): 
    print(String.Format(msg, Array[object](args))) 
+0

谢谢,我使用了Array [object](args)解决方案。我完全可以使用python的事实是一种奖励,所以这个可以远离大多数用户的角色是完全可以接受的。 – 2012-08-20 07:32:35

2

除非我误解你的问题的来回转换),这应该工作:

def logger(msg, *args): 
    print(String.Format(msg, *args)) 
的[分配一个铁Python列表到.NET
+0

扩展呼叫引用中的变量args似乎更加优雅!如果对所有情况都适用,我会检查/验证并删除我的答案。 – 2012-08-21 15:48:34

相关问题