Vlad Riscutia <[email protected]> added the comment:
Looks like this was implemented by design at some point. In cfield.c, we have
specific code to treat character array fields as strings:
/* Field descriptors for 'c_char * n' are be scpecial cased to
return a Python string instead of an Array object instance...
*/
if (PyCArrayTypeObject_Check(proto)) {
StgDictObject *adict = PyType_stgdict(proto);
StgDictObject *idict;
if (adict && adict->proto) {
idict = PyType_stgdict(adict->proto);
if (!idict) {
PyErr_SetString(PyExc_TypeError,
"has no _stginfo_");
Py_DECREF(self);
return NULL;
}
if (idict->getfunc == _ctypes_get_fielddesc("c")->getfunc) {
struct fielddesc *fd = _ctypes_get_fielddesc("s");
getfunc = fd->getfunc;
setfunc = fd->setfunc;
}
#ifdef CTYPES_UNICODE
if (idict->getfunc == _ctypes_get_fielddesc("u")->getfunc) {
struct fielddesc *fd = _ctypes_get_fielddesc("U");
getfunc = fd->getfunc;
setfunc = fd->setfunc;
}
#endif
}
}
Simple fix would be to just remove this whole section though this might break
code which relied on string assignment to such fields. For example:
class T(ctypes.Structure):
_fields_ = (
('member', ctypes.c_char * 16),
)
x = T()
x.member = bytes('Spam', 'ascii')
Above works now but will fail if change is made. There is a high chance this
would break existing code as I imagine people using this due to convenience. An
alternative would be to keep string setfunc but don't change getfunc, though
that is also pretty inconsistent as you will be able to set a string but not
get one back.
If we are willing to take the risk, fix is easy.
----------
nosy: +vladris
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue8161>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com