Отсутствует атрибут `value` для одинаковых объектов массива ctypes

Я знаю 2 способа создания массива переменного тока из последовательности Python data = (1, 2, 3, 4, 5, 6),

Создание класса массива, его инициализация и передача значений через value атрибут:

array_type = ctypes.c_int * len(data)
array1 = array_type()
array1.value = data

Создание класса массива и передача значения в качестве аргументов во время инициализации:

array_type = ctypes.c_int * len(data)
array2 = array_type(*data)
# Or 'array2 = (ctypes.c_int * len(data))(*data)'

Оба генерируют один и тот же тип:

>>> array1
<c_int_Array_6 object at 0x1031d9510>
>>> array2
<c_int_Array_6 object at 0x1031d9400>

Но при попытке доступа к атрибуту значения:

array1.value
>>> (1, 2, 3, 4, 5, 6, 7, 8, 9)
array2.value
>>> AttributeError: 'c_int_Array_6' object has no attribute 'value'

Почему не array2 имеет value атрибут? Насколько я понимаю, эти массивы относятся к одному типу, но по-разному инициализируются.

РЕДАКТИРОВАТЬ: Первый способ динамически добавляет атрибут value, который не является атрибутом массива (если он не имеет тип c_char или c_wchar)! Это не меняет фактические значения в массиве.

1 ответ

Решение

Вы определяете array1.value как data, Но вы не определили array2.value, По умолчанию .value не определен (даже если массив содержит значения).

>>> import ctypes
>>> # Same commands that you provide
>>> # ...
>>> array1.value
(1, 2, 3, 4, 5, 6)
>>> array2.value
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'c_int_Array_6' object has no attribute 'value'

>>> list(array2)
[1, 2, 3, 4, 5, 6]
>>> array2[0]
1

>>> data_bis = (1,4,5)
>>> array2.value = data_bis
>>> array2
<__main__.c_int_Array_6 object at 0x7f86dc981560>
>>> array2.value
(1, 4, 5)

Как видите, вы все равно можете иметь доступ к значениям array2 используя стандартный вызов Python для списка.

Вы можете взглянуть на документацию Python, особенно по основным типам данных, а также по массивам и указателям.

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