2012-08-17 82 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

相關問題