我有以下静态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")
应该起作用,但是不起作用。
答案 0 :(得分:3)
最近我不得不使用Python for .NET解决类似的问题,让我与大家分享发现的问题。
您需要传递方法所需要的尽可能多的参数。由于out
参数(= refence传递)的概念不适用于Python,因此窍门是传递一些期望类型的 dummy参数。
方法调用将首先返回应该返回的值,和 out
值。
对于我的用例,我正在调用的C#方法最初没有返回任何内容(无效方法),但是,Python调用首先返回了None
,然后返回了我之后的out
值,这是here所述的预期行为。
您的第一次尝试无法成功,因为您仅传递了一个参数,而该方法需要两个参数,即out
或ref
参数。
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.))