Модуль 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 и в каждом конкретном случае повторно определять тип данных после того, как требуемый размер уже известен.