###
3 外部関数

前節で説明した通り、外部関数はロードされた共有ライブラリの属性として アクセスできます。デフォルトではこの方法で作成された関数オブジェクトは どんな数の引数でも受け取り、引数としてどんな ctypesデータのインスタンスをも 受け取り、そして、ライブラリローダーが指定したデフォルトの結果の値の型を 返します。関数オブジェクトはプライベートクラスのインスタンスです:

class `_FuncPtr`
  Cの呼び出し可能外部関数のためのベースクラス。

外部関数のインスタンスも C 互換データ型です。それらは Cの関数ポインタを表しています。

この振る舞いは外部関数オブジェクトの特別な属性に代入することによって、 カスタマイズすることができます。

`restype`
  外部関数の結果の型を指定するためにctypes型を代入する。 何も返さない関数を表す`void`に対しては`None`を 使います。

  ctypes 型ではない呼び出し可能な Python オブジェクトを代入することは可能です。 このような場合、関数がC `int`を返すと仮定され、呼び出し可能オブジェクトは この整数を引数に呼び出されます。さらに処理を行ったり、エラーチェックをしたり できるようにするためです。これの使用は推奨されません。より柔軟な後処理や エラーチェックのためには restype として ctypes 型を使い、`errcheck`属性へ 呼び出し可能オブジェクトを代入してください。

`argtypes`
  関数が受け取る引数の型を指定するためにctypes型のタプルを代入します。 `stdcall`呼び出し規約をつかう関数はこのタプルの長さと同じ数の引数で 呼び出されます。 その上、C呼び出し規約をつかう関数は追加の不特定の引数も取ります。

  外部関数が呼ばれたとき、それぞれの実引数は`argtypes`タプルの要素の `from_param`クラスメソッドへ渡されます。このメソッドは実引数を 外部関数が受け取るオブジェクトに合わせて変えられるようにします。 例えば、`argtypes`タプルの`c_char_p`要素は、 ctypes変換規則にしたがって引数として渡されたユニコード文字列を バイト文字列へ変換するでしょう。

  新: ctypes型でない要素をargtypesに入れることができますが、 個々の要素は引数として使える値(整数、文字列、ctypesインスタンス)を返す `from_param`メソッドを持っていなければなりません。 これにより関数パラメータとしてカスタムオブジェクトを 適合するように変更できるアダプタが定義可能となります。

`errcheck`
  Python関数または他の呼び出し可能オブジェクトをこの属性に代入します。 呼び出し可能オブジェクトは三つ以上の引数とともに呼び出されます。

`callable`( | result, func, arguments)

  `result`は外部関数が返すもので、`restype`属性で 指定されます。

  `func`は外部関数オブジェクト自身で、これにより複数の関数の処理結果を チェックまたは後処理するために、同じ呼び出し可能オブジェクトを再利用 できるよになります。

  `arguments`は関数呼び出しに最初に渡されたパラメータが入ったタプルです。 これにより使われた引数に基づた特別な振る舞いをさせることができるようになります。

  この関数が返すオブジェクトは外部関数呼び出しから返された値でしょう。 しかし、戻り値をチェックして、外部関数呼び出しが失敗しているなら例外を 発生させることもできます。

exception `ArgumentError()`
  この例外は外部関数呼び出しが渡された引数を変換できなかったときに 発生します。