Есть ли способ изменить размер списка Python с помощью API-интерфейса Python-C? - PullRequest
0 голосов
/ 27 февраля 2019

Мое C-приложение загружает dll-интерпретатор python и вызывает функцию list = PyList_New(len), чтобы создать новый список python размера 'len'.

Два вопроса:
1. Что произойдет, если я позвоню PyList_Append(list, item) более len раз?Я предполагаю, что это должно вызвать исключение.Правильно ли мое понимание?

2. Что важнее, мой второй вопрос: есть ли способ изменить размер списка?Я посмотрел на API C: https://docs.python.org/2/c-api/list.html#c.PyList_SetItem,, но не смог найти такой API.Любые предложения / комментарии / обходной путь?

Контекст моего вопроса заключается в том, что мне нужно создать список намного раньше, чем когда известны элементы списка и их количество.

1 Ответ

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

PyList_New создает список, заполненный NULL указателями.Вы должны установить все эти указатели, используя PyList_SetItem перед отправкой списка обратно в Python или вызовом любых функций Python на нем.

PyList_AppendPyList_Insert) действительно эквивалентны вызовуsomelist.appendsomelist.insert) из Python.Они изменяют размер списка для вас.Я не уверен на 100%, если они имеют какие-либо элементы NULL, поэтому, вероятно, лучше не вызывать их в список, который вы составили из PyList_New и который вы еще не полностью заполнили.То, что вы делаете (выделение списка с некоторыми NULL указателями, а затем добавление его), безусловно, неправильно, так как указатели NULL никогда не заполняются. Вместо этого вы должны просто использовать PyList_Append и PyList_Insert в построенном спискеиз пустого.Вы также можете вызвать list.extend, чтобы добавить несколько элементов в список одновременно - прямого доступа к этому через API C нет, но вы можете вызвать его через PyObject_CallMethodObjArgs или аналогичный.

Внутренне список распределяетсябольше места, чем нужно, нужно лишь иногда перераспределять.Вы не можете это контролировать.

...