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

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