Как я могу вернуть список из функции Python

https://stackoverflow.com/a/8978435/1335492

...показывает, как вызвать скрипт Python из LibreOffice BASIC: (Как я могу вызвать макрос Python в формуле ячейки в OpenOffice.Org Calc? )

Function invokeScriptFunc(..., args As Array, outIdxs As Array, outArgs As Array)
   ...
   invokeScriptFunc = oScript.invoke(args, outIdxs, outArgs)
end Function

Но это не работает для меня. Я получаю «БАЗОВАЯ ошибка времени выполнения. Аргумент не является обязательным» для outArgs. С другой стороны, «oScript.invoke(args, Array(), Array())» не является ошибкой.

Пример не был ошибочным 10 лет, вряд ли будет ошибочным сегодня. Но у меня нет примера его работы со скриптом Python, который возвращает список: возможно, это моя проблема.

Сценарий, который я пытаюсь использовать:

def MyFunc(a,b):
  return [a,b]

Я не получаю ошибку, когда пытаюсь

Function invokeScriptFunc(..., args As Array, outIdxs As Array)
   ...
   dim outArgs as array
   invokeScriptFunc = oScript.invoke(args, outIdxs, outArgs)
end Function

или

   invokeScriptFunc = oScript.invoke(args, outIdxs, array())

но в любом случае я не приблизился к тому, чтобы увидеть возвращаемое значение, которое я хочу. FWIW, когда я "затемняю outArgs как массив", .invoke возвращает объект с lbound=0 и ubound=-1. outArgs(0) недействителен.

Я не пытаюсь анализировать вывод: это будет позже. Я просто пытаюсь заставить его работать без ошибок.

Ваш пример не завершен — он должен показать код, который выдает ошибку. У меня это работает без проблем: result = invokeScriptFunc(Array(5, 5), Array(), Array()). Я пока буду ставить минусы, пока вы это не исправите (извините, я знаю, что получать минусы неинтересно, но я уверен, что вы сможете это исправить).

Jim K 21.11.2022 14:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Первый параметр .invoke — (все аргументы).

Второй параметр .invoke — это список, указывающий, какие аргументы являются выходными.

Третий параметр .invoke — (выходные аргументы). Потому что в Java аргументы метода неизменяемы. Интерфейс Java возвращает значения в (выходные аргументы). Интерфейс python не использует (выходные аргументы): вывод возвращается как возвращаемое значение .invoke.

Таким образом, для скриптов Python outIdxs должен быть пустым массивом, а outArgs — пустым массивом.

Это не объясняет, почему передача пустого массива в outIdxs и outArgs иногда является ошибкой, в зависимости от того, как был объявлен пустой массив. Это связано с тем, как происходят объявления и ошибки определяются, обнаруживаются и сообщаются в LibreOffice BASIC, что является совершенно отдельной темой.

Все необходимое для возврата списка описано в документации по адресу https://help.libreoffice.org/latest/en-US/text/sbasic/guide/basic_2_python.html. Вот рабочий код.

Function invokeScriptFunc(args As Array)
    oScript = GetPythonScript("filename.py$MyFunc", "user")
    invokeScriptFunc = oScript.invoke(args, Array(), Array())
End Function

Sub call_invokeScriptFunct
    result = invokeScriptFunc(Array(5, 5))
    MsgBox result(1)
End Sub

Я изменил код Python, чтобы он действительно что-то делал.

def MyFunc(a, b):
    return [a+1, b-1]

Результат: 4, что равно 5 минус 1.

Другие вопросы по теме