Python .NET调用C#方法,它有一个返回值和一个out参数

问题描述 投票:1回答:1

我有以下静态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")应该有效,但事实并非如此。

c# python python-3.x out python.net
1个回答
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.))
© www.soinside.com 2019 - 2024. All rights reserved.