New submission from Thomas:

If a callback function returns a ctypes._SimpleCData object, it will fail with 
a type error and complain that it expects a basic type.

Using the qsort example:

def py_cmp_func(a, b):
    print(a.contents, b.contents)
    return c_int(0)

> TypeError: an integer is required (got type c_int)
> Exception ignored in: <function py_cmp_func at 0x2439648>

This is somewhat surprising as it is totally fine to pass a c_int (or an int) 
as an c_int argument. But this is really an issue for subclasses of fundamental 
data types:

(sticking with qsort for simplicity, full example attached)

class CmpRet(c_int):
    pass

cmp_ctype = CFUNCTYPE(CmpRet, POINTER(c_int), POINTER(c_int))

def py_cmp_func(a, b):
    print(a.contents, b.contents)
    return CmpRet(0)

> TypeError: an integer is required (got type CmpRet)
> Exception ignored in: <function py_cmp_func at 0x1049cf8>

This is inconsistent with the no transparent argument/return type conversion 
rule for subclasses.

Consider for instance an enum with a specific underlying type. A subclass (with 
__eq__ on value) from the corresponding ctype can be useful to provide a 
typesafe way to pass / receive those from C. Due to the described behavior, 
this doesn't work for callbacks.

This is related to #5710, that discusses composite types.

----------
files: callback_ret_sub.py
messages: 264056
nosy: tilsche
priority: normal
severity: normal
status: open
title: returning ctypes._SimpleCData objects from callbacks
type: behavior
versions: Python 3.5
Added file: http://bugs.python.org/file42575/callback_ret_sub.py

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue26833>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to