【问题标题】:Python NET call C# method which has a return value and an out parameterPython NET 调用具有返回值和输出参数的 C# 方法
【发布时间】:2019-07-08 14:09:30
【问题描述】:

我有以下静态 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 基本上做同样的事情。最简单的方法 do out参数是不传递它们并接受它们作为额外的回报 值,以及 ref 参数将输入值作为参数传递 并接受输出值作为额外的返回值。

这会声称r1, d1 = Double.TryParse("12.3") 应该可以工作,但它没有。

【问题讨论】:

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


    【解决方案1】:

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

    您需要传递方法所需的尽可能多的参数。由于out 参数(= 通过引用传递)的概念不适用于 Python,因此诀窍是传递一些预期类型的​​虚拟参数

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

    对于我的用例,我调用的 C# 方法最初没有返回任何内容(void 方法),但是 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)
    

    您可以通过在调用前后检查其id 来观察最后一行对dummy_out 没有任何影响。

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

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

    【讨论】:

    • 感谢您的回答。我的第二次尝试是r2, d2 = Double.TryParse("12.3", d2),因此定义了 d2。我会编辑我的问题。对不起我的错。我仍然收到以下错误:TypeError: No method matches given arguments.
    • 我试图让您的代码正常工作。如果您按照我写的内容进行操作,它确实有效,但有一件事我没有正确理解,那就是虚拟 out 参数的类型必须与方法期望的相同.这工作returned_val, real_out = Double.TryParse("12.3", Double(0.))
    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    相关资源
    最近更新 更多