Найти - Пользователи
Полная версия: Возврат 3-х и более переменных из функции
Начало » Python для новичков » Возврат 3-х и более переменных из функции
1
Danil_lll
Всем доброго времени суток.
Есть COM-библиотека, которую вызываю в Python через: win32com.client. Сама COM-библиотека написана на С++. Т.е. в ней есть такие функци, которые могут возвращать 2 и более переменных.
Вот например функция, в которую отправим 6 параметров, 3 из которых вернутся с новым значением:
 STDMETHODIMP Hybrid::Verify(BSTR alias, BSTR inData, BSTR inSign, BSTR* outData, BSTR* outVerifyInfo, BSTR* outCert)
{
    ..............................................
    return S_OK;
}

Когда же на выход был один параметр:
 STDMETHODIMP Hybrid::GetLastError(ULONG* rv)
{
    .......................................
    return S_OK;
}
на Python-е я использовал простое присваивание:

 err = Hybrid.GetLastError()


А вот как получить с таких функций сразу 2,3,4 и более параметров?

Пробовал вот так! Не работает…
 outData, outVerifyInfo, outCert  = Hybrid.Verify(" ", inD, inS)

p.s. Стоит Python 3.7
Rafik
Попробуй вызвать aa = Hybrid.Verify(“ ”, inD, inS, outData, outVerifyInfo, outCert) и посмотри содержимое переменных aa, outData, outVerifyInfo, outCert после отработки функции. Если не ошибаюсь, то BSTR* означает, что передача параметра идёт по ссылке, т.е. передаётся ссылка на объект (указатель). Изменение такой переменной внутри функции приводит к изменению содержимого “внешней” (“глобальной”) переменной. Это как global внутри функции.
Danil_lll
Rafik
Попробуй вызвать aa = Hybrid.Verify(“ ”, inD, inS, outData, outVerifyInfo, outCert) и посмотри содержимое переменных aa, outData, outVerifyInfo, outCert после отработки функции.
Ничего… Ошибка.
Форму выбивает
Rafik
Сделай print содержимого переменных outData, outVerifyInfo, outCert до и после функции. Поставь точку останова после print-ов, стоящих за функцией. Если значения меняются, то с функцией всё норм. Ищи ошибку далее. Если падает на вызове функции, прошерсти саму функцию (если доступны исходники) или доки на саму функцию (если нет исходников).
Danil_lll
Rafik
Сделай print содержимого переменных outData, outVerifyInfo, outCert до и после функции. Поставь точку останова после print-ов, стоящих за функцией.
Делаю вот так
  outData = ""
outVerifyInfo = ""
outCert = ""
try:
      x = HybridVerify("", inD, inS,outData, outVerifyInfo, outCert)
except:
      print(x,outData, outVerifyInfo,outCert)
Выдает ошибку… Не доходит до принта…

Если делать вот так:
  try:
     HybridVerify("", inD, inS,outData, outVerifyInfo, outCert)
except:
      print(outData, outVerifyInfo,outCert)
То просто выводит пустые строки.
Danil_lll
Если падает на вызове функции, прошерсти саму функцию (если доступны исходники) или доки на саму функцию (если нет исходников).
Шерстить саму функцию нет смысла… Она рабочая(Уже написал интерфейсы для этой библиотеки на C#, GoLang, PHP)…
Поэтоу здесь только вопрос в том, как возвращать несколько значений без RETURN…

Danil_lll
Разобрался…. Спасибо)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB