我有以下静态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")
应该有效,但事实并非如此。
我最近使用Python for .NET解决了类似的问题,让我与你分享我发现的内容。
您需要传递方法所需的参数。由于out
参数的概念(=通过refence传递)不适用于Python,诀窍是传递一些预期类型的伪参数。
方法调用将首先返回它应该返回的值,以及out
值。
对于我的用例,我调用的C#方法最初没有返回任何内容(void方法),然而,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.))