Вызов метода Python NET C #, который имеет возвращаемое значение и выходной параметр - PullRequest
0 голосов
/ 14 февраля 2019

У меня следующий статический метод C #

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

, который я хотел бы вызвать из Python с помощью пакета Python NET.

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.

CPython с использованием PythonNet делает в основном то же самое.Простой способ получить параметры - не передавать их и принимать их как дополнительные возвращаемые значения, а для параметров ref передавать входные значения в качестве аргументов и принимать выходные значения в качестве дополнительных возвращаемых значений.

Это будет означать, что r1, d1 = Double.TryParse("12.3") должно работать, но это не так.

1 Ответ

0 голосов
/ 18 февраля 2019

Мне недавно пришлось решать аналогичную проблему с использованием Python для .NET , позвольте мне поделиться с вами тем, что я обнаружил.

Вам необходимо передать столько аргументов, сколькоМетод требует.Поскольку концепция out аргументов (= переданная посредством refence) не применима к Python, хитрость заключается в том, чтобы передать некоторые фиктивные аргументы ожидаемого типа.

Вызов методасначала я собираюсь вернуть значения, которые он должен вернуть, и значения out.

Для моего случая использования вызываемый мной метод C # ничего не возвращал изначально (voidметод), тем не менее, вызов Python возвратил сначала None, а затем out значения, которые я получил, что является ожидаемым поведением, как указано здесь .

Ваша первая попытка не смоглаработать, потому что вы передаете только один аргумент, в то время как метод ожидает два, будь то 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.))
...