[docs] undocumented argtypes magic in ctypes?

Eli Bendersky eliben at gmail.com
Tue Mar 5 15:26:24 CET 2013


Hello,

While playing with ctypes a bit, I noticed a feature that doesn't appear to
be documented. Suppose I import the readdir_r function (assuming DIRENT is
a correctly declared ctypes.Structure):

DIR_p = c_void_p
DIRENT_p = POINTER(DIRENT)
DIRENT_pp = POINTER(DIRENT_p)

readdir_r = lib.readdir_r
readdir_r.argtypes = [DIR_p, DIRENT_p, DIRENT_pp]
readdir_r.restype = c_int

It seems that I can then call it as follows:

dirent = DIRENT()
result = DIRENT_p()

readdir_r(dir_fd, dirent, result)

Note that while readdir_r takes DIRENT_p and DIRENT_pp as its second and
third args, I pass in just DIRENT and DIRENT_p, accordingly. What I should
have done is use byref() on both, but ctypes seems to have some magic
applied when argtypes declares pointer types. If I use byref, it still
works. However, if I keep the same call and comment out the argtypes
declaration, I get a segfault.

So, is it a feature that should be documented, explicitly discouraged or is
it a bug?

Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/docs/attachments/20130305/4b4d4637/attachment.html>


More information about the docs mailing list