2012-05-10 18 views
2

我有一個需要與C#函數進行某種通信的python腳本。該功能需要三個參數,其中兩個通過out關鍵字返回。聲明看起來是這樣的:在Ironpython的二維數組上進行參考/輸出

RunComputation(InfoParams locInfo, out double[,] dataTable, out int numPoints){ ... } 

因爲Python是一種動態類型語言,它不知道如何應對關鍵字。我做了一些搜索,發現了一些關於clr.StrongBox和clr.Reference的東西,這些東西在需要傳遞強類型對象的情況下似乎很簡單。

對於爲NumPoints參數,我可以在Python代碼中定義是這樣的:

num_points = clr.Reference[int] 

而且似乎是罰款。問題來自dataTable數組。我不知道語法來告訴它,我的強類型對象是一個雙精度數組。它給出的錯誤告訴我它期待着一個StrongBox[Array[float]]類型的實例。我嘗試從System導入數組,以查看我是否可以添加該C#類型作爲參考,但失敗了。有任何想法嗎?

+0

我不對IronPython編程知道很多,但也許你可以考慮添加一個C#包裝函數,它接受你的單個InfoParams參數並返回一個由double [,] dataTable和int numPo組成的對象ints'。通過這種方式,C#可以處理輸出,IronPython只需獲取一個對象,通過它的兩個公開屬性可以訪問該數據。 –

+0

有道理。當我等待看看是否有人有直接的解決方案時,我會放棄這一做法。 – KChaloux

回答

1

如果您僅使用out參數,則還可以使用implicit way,即如果您未將任何out參數傳遞給該方法,則它們將作爲元組返回。

例如

d = Dictionary[str, float]() 
(keyfound,value) = d.TryGetValue("b") 

它也適用於ref參數。
想象有以下方法:

int Foo(int x, double[,] v) 

你可以調用這樣的方法:

nrows = 5 
ncols = 5 
array = Array.CreateInstance(float, nrows, ncols) 
(x, arrayNew) = obj.Foo(3, array) 

,最後的array修改後的值被包含到arrayNew