Как отладить сигнатуру функции Python при сбое вызова функции dotnet с python.net - PullRequest
0 голосов
/ 17 октября 2019

Моя проблема

Я пытаюсь вызвать функцию ac # f() из python. Функция f() имеет сложную сигнатуру со многими входными и выходными аргументами. Фактическая подпись выглядит так:

Void f(MathNet.Numerics.LinearAlgebra.Matrix`1[System.Double],
       MathNet.Numerics.LinearAlgebra.Matrix`1[System.Double],
       MathNet.Numerics.LinearAlgebra.Matrix`1[System.Double],
       Double[,], Double[,], Double, Double, Double,
       Double ByRef, Double ByRef, Double ByRef, Double ByRef,
       Double ByRef, Double ByRef, Double ByRef, Double ByRef,
       Double ByRef, Double ByRef, Double ByRef, Double ByRef)

Я пытаюсь вызвать эту функцию, используя пакет python.net. Мой вызов завершается с ошибкой:

No method matches given arguments for f

Что я пробовал

Я знаю, что соответствующая функция dotnet выбрана из python.net по ее подписи. Я могу прочитать ожидаемую сигнатуру функции f, обратившись к импортированному классу dotnet:

mydotnetclass.f.Overloads

Моя проблема в том, что я не знаю, какую сигнатуру создает мой текущий вызов функции, и поэтому я не могу увидеть, какаяПараметр вызывает совпадение подписи. К сожалению, с python.net невозможно явно вызвать конкретную перегрузку для переопределения совпадения подписи.

Я приложил все усилия, чтобы сопоставить подпись входных параметров. Тип обобщенной матрицы, который я создал, используя

matrixArgument = LinearAlgebra.Double.Matrix.Build.DenseOfRowArrays(list(numpy_ndMatrix))
arrayArg = clr.System.Array.CreateInstance(clr.System.Double,numpyArray.shape[0],numpyArray.shape[1])

Для аргументов типа Double я использовал обычные переменные типа Python для двойного типа, а также clr.System.Double() типы.

Возвращаемые переменные, которые оставлены не инициализированными.

Вопрос

Можно ли отобразить подпись, созданную при вызове функции / метода для функции dotnet? Например, в этой ситуации

a=1.0
b=1
c="abc"
x,y = mydotnetclass.g(a,b,c)

Я бы хотел видеть следующую подпись

Void mydotnetclass.g(Double, int, String, Double byref, String byref)

. Очевидно, что часть подписи возвращаемых параметров не может быть получена из вызова. Само по себе, но только из реализации функции g().

По крайней мере, мне нужно знать, какие параметры вызывают несоответствие сигнатур!

...