前節で説明した通り、外部関数はロードされた共有ライブラリの属性として アクセスできます。デフォルトではこの方法で作成された関数オブジェクトは どんな数の引数でも受け取り、引数としてどんな ctypesデータのインスタンスをも 受け取り、そして、ライブラリローダーが指定したデフォルトの結果の値の型を 返します。関数オブジェクトはプライベートクラスのインスタンスです:
外部関数のインスタンスも C 互換データ型です。それらは Cの関数ポインタを表しています。
この振る舞いは外部関数オブジェクトの特別な属性に代入することによって、 カスタマイズすることができます。
void
に対してはNone
を
使います。
ctypes 型ではない呼び出し可能な Python オブジェクトを代入することは可能です。
このような場合、関数がC int
を返すと仮定され、呼び出し可能オブジェクトは
この整数を引数に呼び出されます。さらに処理を行ったり、エラーチェックをしたり
できるようにするためです。これの使用は推奨されません。より柔軟な後処理や
エラーチェックのためには restype として ctypes 型を使い、errcheck属性へ
呼び出し可能オブジェクトを代入してください。
stdcall
呼び出し規約をつかう関数はこのタプルの長さと同じ数の引数で
呼び出されます。
その上、C呼び出し規約をつかう関数は追加の不特定の引数も取ります。
外部関数が呼ばれたとき、それぞれの実引数はargtypesタプルの要素の from_paramクラスメソッドへ渡されます。このメソッドは実引数を 外部関数が受け取るオブジェクトに合わせて変えられるようにします。 例えば、argtypesタプルのc_char_p要素は、 ctypes変換規則にしたがって引数として渡されたユニコード文字列を バイト文字列へ変換するでしょう。
新: ctypes型でない要素をargtypesに入れることができますが、 個々の要素は引数として使える値(整数、文字列、ctypesインスタンス)を返す from_paramメソッドを持っていなければなりません。 これにより関数パラメータとしてカスタムオブジェクトを 適合するように変更できるアダプタが定義可能となります。
result, func, arguments) |
result
は外部関数が返すもので、restype属性で
指定されます。
func
は外部関数オブジェクト自身で、これにより複数の関数の処理結果を
チェックまたは後処理するために、同じ呼び出し可能オブジェクトを再利用
できるよになります。
arguments
は関数呼び出しに最初に渡されたパラメータが入ったタプルです。
これにより使われた引数に基づた特別な振る舞いをさせることができるようになります。
この関数が返すオブジェクトは外部関数呼び出しから返された値でしょう。 しかし、戻り値をチェックして、外部関数呼び出しが失敗しているなら例外を 発生させることもできます。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。