Сообщить об ошибке.

Возвращаемые типы внешних C-функций, модуль ctypes в Python

Примеры указания типов, возвращаемых внешними C-функциями

По умолчанию предполагается, что функции загружаемых библиотек возвращают тип C int. Другие типы возвращаемого значения можно указать, установив атрибут .restype объекта функции.

Вот более сложный пример, он использует функцию strchr(), которая ожидает указатель на строку и символ и возвращает указатель на строку:

>>> from ctypes import *
>>> strchr = libc.strchr
>>> strchr(b"abcdef", ord("d"))  
# 8059983

# c_char_p-это указатель на строку
>>> strchr.restype = c_char_p 
>>> strchr(b"abcdef", ord("d"))
# b'def'
>>> print(strchr(b"abcdef", ord("x")))
# None

Если надо избежать вышеуказанных вызовов ord('x'), то можно установить атрибут .argtypes, а второй аргумент будет преобразован из односимвольного байтового объекта Python в символ C:

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

Можно использовать вызываемый объект Python (например, функцию или класс) в качестве атрибута рестайпа, если внешняя функция возвращает целое число. Объект будет вызываться с целым числом, возвращаемым функцией C, а результат этого вызова будет использоваться как результат вызова этой функции. Такое поведение полезно для проверки возвращаемых значений ошибок и автоматического создания исключения:

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

В примере WinError() - это функция, которая вызывает API Windows FormatMessage() для получения строкового представления кода ошибки и возвращает исключение. Функция WinError() принимает необязательный параметр кода ошибки, если параметр не используется, то она вызывает ctypes.GetLastError() для получения кода ошибки.

Обратите внимание, что через атрибут .errcheck доступен гораздо более мощный механизм проверки ошибок. Подробности смотрите в справочном руководстве API Windows.