14.14.2.8 標準データ型

クラス Union( *args, **kw)
ネイティブのバイトオーダーでの共用体のための抽象ベースクラス。

クラス BigEndianStructure( *args, **kw)
ビックエンディアンバイトオーダーでの構造体のための抽象ベースクラス。

クラス LittleEndianStructure( *args, **kw)
リトルエンディアンバイトオーダーでの構造体のための抽象ベースクラス。

ネイティブではないバイトオーダーを持つ構造体にポインタ型フィールドあるいは ポインタ型フィールドを含む他のどんなデータ型をも入れることはできません。

クラス Structure( *args, **kw)
ネイティブのバイトオーダーでの構造体のための抽象ベースクラス。

具象構造体型と具象共用体型はこれらの型の一つをサブクラス化することで 作らなければなりません。少なくとも、_fields_クラス変数を 定義する必要があります。ctypesは、属性に直接アクセスしてフィールドを 読み書きできるようにする記述子を作成するでしょう。これらは、

_fields_
構造体のフィールドを定義するシーケンス。要素は2要素タプルか3要素タプルで なければなりません。第一要素はフィールドの名前です。 第二要素はフィールドの型を指定します。それはどんなctypesデータ型でも 構いません。

c_intのような整数型のために、オプションの第三要素を 与えることができます。フィールドのビット幅を定義する 正の小整数である必要があります。

一つの構造体と共用体の中で、フィールド名はただ一つである必要があります。 これはチェックされません。名前が繰り返しでてきたときにアクセスできるのは 一つのフィールドだけです。

Structureサブクラスを定義するクラス文の後で_fields_クラス変数を定義することができます。 これにより自身を直接または間接的に参照するデータ型を 作成できるようになります:

class List(Structure):
    pass
List._fields_ = [("pnext", POINTER(List)),
                 ...
                ]

しかし、_fields_クラス変数はその型が最初に使われる (インスタンスが作成される、それに対してsizeof()が呼び出されるなど)より前に 定義されていなければなりません。その後_fields_クラス変数へ代入すると AttributeErrorが発生します。

構造体および共用体サブクラスは位置引数と名前付き引数の両方を受け取ります。 位置引数は_fields_定義中に現れたのと同じ順番で フィールドを初期化するために使われ、 名前付き引数は対応する名前を使ってフィールドを初期化するために 使われます。

構造体型のサブクラスを定義することができ、もしあるならサブクラス内で 定義された_fields_に加えて、ベースクラスのフィールドも 継承します。

_pack_
インスタンスの構造体フィールドのアライメントを上書きできるようにする オブションの小整数。_pack__fields_が 代入されたときすでに定義されていなければならない。そうでなければ、 何ら影響はありません。

_anonymous_
無名(匿名)フィールドの名前が並べあげられたオプションのシーケンス。 _fields_が代入されたとき、_anonymous_がすでに 定義されていなければならない。そうでなければ、何ら影響はありません。

この変数に並べあげられたフィールドは構造体型もしくは共用体型フィールドで ある必要があります。構造体フィールドまたは共用体フィールドを作る必要なく、 入れ子になったフィールドに直接アクセスできるようにするために、 ctypesは構造体型の中に記述子を作成します。

型の例です(Windows):

class _U(Union):
    _fields_ = [("lptdesc", POINTER(TYPEDESC)),
                ("lpadesc", POINTER(ARRAYDESC)),
                ("hreftype", HREFTYPE)]

class TYPEDESC(Structure):
    _fields_ = [("u", _U),
                ("vt", VARTYPE)]

    _anonymous_ = ("u",)

TYPEDESC構造体はCOMデータ型を表現しており、vtフィールドは 共用体フィールドのどれが有効であるかを指定します。uフィールドは 匿名フィールドとして定義されているため、TYPEDESCインスタンスから取り除かれて そのメンバーへ直接アクセスできます。 td.lptdesctd.u.lptdescは同等ですが、前者がより高速です。 なぜなら一時的な共用体インスタンスを作る必要がないためです:

td = TYPEDESC()
td.vt = VT_PTR
td.lptdesc = POINTER(some_type)
td.u.lptdesc = POINTER(some_type)

構造体のサブ-サブクラスを定義することができ、ベースクラスのフィールドを 継承します。サブクラス定義に別の_fields_変数がある場合は、 この中で指定されたフィールドはベースクラスのフィールドへ追加されます。

構造体と共用体のコンストラクタは位置引数とキーワード引数の両方を受け取ります。 位置引数は_fields_の中に現れたのと同じ順番でメンバーフィールドを 初期化するために使われます。コンストラクタのキーワード引数は属性代入として解釈され、 そのため、同じ名前をもつ_fields_を初期化するか、 _fields_に存在しない名前に対しては新しい属性を作ります。

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