#python #c# #clr #python.net
Вопрос:
Я использую библиотеку dll c# в Python3, и модуль, который я использую, — это DaveSkender/Stock.Индикаторы Он написан на C# и соответствует спецификации общего языка (CLS). Поэтому я скомпилировал его как dll и импортировал в Python3, как показано ниже:
import clr
clr.AddReference(r'dll/Skender.Stock.Indicators')
До сих пор он работает и может быть уверен, что модуль успешно импортирован.
Но проблема заключается в передаче параметра.
В C# DLL есть подобный метод:
public static IEnumerable<SmaResult> GetSma<TQuote>(
IEnumerable<TQuote> history,
int lookbackPeriod)
where TQuote : IQuote
{
// WHATEVER
}
Поэтому я передал параметры в Python следующим образом:
from System.Collections.Generic import List
// Definitely, Qoute is inherited from IQoute
history_list = List[Qoute]()
Indicator.GetSma(history_list, int(1))
Но он продолжает показывать ошибку типа:
TypeError: No method matches given arguments for GetSma: (<class 'System.Collections.Generic.0, Culture=neutral, PublicKeyToken=null]]'>, <class 'int'>)
Я не знаю, какой тип в Python совместим с C#.
Что я должен передать в этом методе?
Я имею в виду, что я должен выдавать за IEnumerable в Python?
Комментарии:
1. Может быть, другой параметр? Как определяется int в python?
2. И кстати, вы показываете метод GetSmaExtended, но вы используете (или пытаетесь использовать) метод GetSma.
3. @Ralf О, спасибо, что проявили интерес к этому. Я исправил это, но ничего не изменилось. 🙂
Ответ №1:
Спасибо @Ralf, я снова заглянул в код на C# GetSma()
. И это универсальный метод, его следует вызывать в универсальной форме. Поэтому я попытался вызвать этот метод, как показано ниже:
Indicator.GetSma[Qoute](history_list, int(1))
Это работает!! Надеюсь, этот ответ будет полезен, если есть кто-то вроде меня.