14.14.1.20 可変サイズのデータ型

ctypesは可変サイズの配列と構造体をサポートしています (バージョン0.9.9.7で追加されました)。

resize関数は既存のctypesオブジェクトのメモリバッファのサイズを 変更したい場合に使えます。この関数は第一引数にオブジェクト、第二引数に 要求されたサイズをバイト単位で指定します。メモリブロックはオブジェクト型で 指定される通常のメモリブロックより小さくすることはできません。 これをやろうとすると、ValueErrorが発生します:

>>> 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の動的性質を使って 一つ一つデータ型を(再)定義することです。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。