###
8 戻り値の型

デフォルトでは、関数はC `int`を返すと仮定されます。他の戻り値の型を指定するには、 関数オブジェクトの`restype`属性に設定します。

さらに高度な例として、`strchr`関数を使います。この関数は文字列ポインタとcharを受け取り、 文字列へのポインタを返します。

    >>> strchr = libc.strchr
    >>> strchr("abcdef", ord("d")) # doctest: +SKIP
    8059983
    >>> strchr.restype = c_char_p # c_char_pは文字列へのポインタ
    >>> strchr("abcdef", ord("d"))
    'def'
    >>> print strchr("abcdef", ord("x"))
    None
    >>>

上の`ord("x")`呼び出しを避けたいなら、`argtypes`属性を設定することができます。 二番目の引数が一文字のPython文字列からCのcharへ変換されます:

    >>> strchr.restype = c_char_p
    >>> strchr.argtypes = [c_char_p, c_char]
    >>> strchr("abcdef", "d")
    'def'
    >>> strchr("abcdef", "def")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ArgumentError: argument 2: exceptions.TypeError: one character string expected
    >>> print strchr("abcdef", "x")
    None
    >>> strchr("abcdef", "d")
    'def'
    >>>

外部関数が整数を返す場合は、`restype`属性として呼び出し可能な Pythonオブジェクト(例えば、関数またはクラス)を使うこともできます。 呼び出し可能オブジェクトはC関数が返す`integer`とともに呼び出され、 この呼び出しの結果は関数呼び出しの結果として使われるでしょう。 これはエラーの戻り値をチェックして自動的に例外を発生させるために役に立ちます:

    >>> GetModuleHandle = windll.kernel32.GetModuleHandleA # doctest: +WINDOWS
    >>> def ValidHandle(value):
    ...     if value == 0:
    ...         raise WinError()
    ...     return value
    ...
    >>>
    >>> GetModuleHandle.restype = ValidHandle # doctest: +WINDOWS
    >>> GetModuleHandle(None) # doctest: +WINDOWS
    486539264
    >>> GetModuleHandle("something silly") # doctest: +WINDOWS
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "<stdin>", line 3, in ValidHandle
    WindowsError: [Errno 126] The specified module could not be found.
    >>>

`WinError`はエラーコードの文字列表現を得るためにWindowsの`FormatMessage()` apiを 呼び出し、例外を返す関数です。`WinError`はオプションで エラーコードパラメータを取ります。このパラメータが使われない場合は、 エラーコードを取り出すために`GetLastError()`を呼び出します。

`errcheck`属性によってもっと強力なエラーチェック機構を利用できることに 注意してください。詳細はリファレンスマニュアルを参照してください。