Python NET调用C#方法,该方法具有返回值和out参数

时间:2019-02-14 14:04:59

标签: c# python python-3.x out python.net

我有以下静态C#方法

public static bool TryParse (string s, out double result)

我想使用Python NET软件包从Python调用。

import clr
from System import Double
r0 = Double.IsNaN(12.3) # works

r1, d1 = Double.TryParse("12.3") # fails! TypeError: No method matches given arguments. This works in IronPython.

d2 = 0.0
r2, d2 = Double.TryParse("12.3", d2) # fails! TypeError: No method matches given arguments

有什么主意吗?

更新

我找到了以下答案,请参见https://stackoverflow.com/a/19600349/7556646

  

使用PythonNet的CPython基本上具有相同的作用。简单的方法   执行参数是不传递它们,并接受它们作为额外的回报   值,并使ref参数将输入值作为参数传递   并接受输出值作为额外的返回值。

这将表明r1, d1 = Double.TryParse("12.3")应该起作用,但是不起作用。

1 个答案:

答案 0 :(得分:3)

最近我不得不使用Python for .NET解决类似的问题,让我与大家分享发现的问题。

您需要传递方法所需要的尽可能多的参数。由于out参数(= refence传递)的概念不适用于Python,因此窍门是传递一些期望类型的 dummy参数

方法调用将首先返回应该返回的值, out值。

对于我的用例,我正在调用的C#方法最初没有返回任何内容(无效方法),但是,Python调用首先返回了None,然后返回了我之后的out值,这是here所述的预期行为。

您的第一次尝试无法成功,因为您仅传递了一个参数,而该方法需要两个参数,即outref参数。

r1, d1 = Double.TryParse("12.3")

您的第二次尝试也不起作用,因为伪参数的类型与该方法预期的类型不匹配,在这种情况下为Double

d2 = 0.0
r2, d2 = Double.TryParse("12.3", d)

这可以解决问题:

import clr
from System import Double
dummy_out = Double(0.)
returned_val, real_out = Double.TryParse("12.3", dummy_out)

通过在通话前后检查dummy_out,可以观察到最后一行对id没有任何影响。

因此,您需要的代码较短版本为:

returned_val, real_out = Double.TryParse("12.3", Double(0.))