[Python-Dev] Is "t#" argument format meant to be char buffer, or just read-only?
Brett Cannon
brett at python.org
Thu Jun 8 01:55:19 CEST 2006
I fixed the crasher for ``int(buffer(array.array('c')))`` by making
buffer objects operate properly. Problem is that by doing so I broke
the ctypes tests with a bunch of similar errors::
======================================================================
ERROR: test_endian_double (ctypes.test.test_byteswap.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/code/python/trunk/Lib/ctypes/test/test_byteswap.py", line
134, in test_endian_double
self.failUnlessEqual(bin(struct.pack("d", math.pi)), bin(s))
File "/code/python/trunk/Lib/ctypes/test/test_byteswap.py", line 7, in bin
return hexlify(buffer(s)).upper()
TypeError: requested buffer type not available
Turns out the test does the following::
binascii.hexlify(buffer(ctypes.c_double(math.pi)))
This is a problem because binascii.hexlify() uses "t#" as its argument
format string to PyArg_ParseTuple() and that fails now with a
TypeError since ctypes.c_double (which subclasses ctypes._SimpleCData
which defines the buffer interface) does not have a char buffer
defined.
Now this used to pass since buffer objects just used the read or write
buffer in place of the char buffer, regardless if the wrapped object
had a char buffer function defined.
But in checking out what "t#" did, I found a slight ambiguity in the
docs. The docs say "read-only character buffer" for the short
description, but "read-only buffer" for the longer description. Which
is it?
Plus, Thomas, you might want to change _SimpleCData if you want it to
truly suport char buffers.
-Brett
More information about the Python-Dev
mailing list