Сообщить об ошибке.

Поддержка данных переменного размера модулем ctypes в Python

Модуль ctypes обеспечивает некоторую поддержку массивов и структур переменного размера.

Для изменения размера буфера памяти существующего объекта ctypes можно использовать функцию ctypes.resize(). Функция принимает объект в качестве первого аргумента, а в качестве второго аргумента запрашиваемый размер в байтах. Блок памяти не может быть меньше, чем естественный блок памяти, указанный типом объекта. При попытке изменения блок памяти в меньшую сторону возникает ошибка ValueError:

>>> from ctypes import *
>>> short_array = (c_short * 4)()
>>> print(sizeof(short_array))
# 8
>>> resize(short_array, 4)
# Traceback (most recent call last):
#     ...
# ValueError: minimum size is 8
>>> resize(short_array, 32)
>>> sizeof(short_array)
# 32
>>> sizeof(type(short_array))
# 8

Это замечательно, но как же получить доступ к дополнительным элементам, содержащимся в этом массиве? Ответ - никак, так как тип по-прежнему знает только 4 элемента, то получим ошибки при доступе к элементам за пределами этого типа:

>>> short_array[:]
# [0, 0, 0, 0]
>>> short_array[7]
# Traceback (most recent call last):
#    ...
# IndexError: invalid index

Другой способ использовать типы данных переменного размера в модуле ctypes - это использовать динамическую природу Python и в каждом конкретном случае повторно определять тип данных после того, как требуемый размер уже известен.