[Python-Dev] Is "t#" argument format meant to be char buffer, or just read-only?

Brett Cannon brett at python.org
Thu Jun 8 15:52:03 CEST 2006


On 6/8/06, Thomas Heller <theller at python.net> wrote:
>
> Brett Cannon wrote:
> > 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::
>
> You have not yet committed this fix, right?


Nope; I was waiting to hear back on all of this; no committing of code that
knowingly breaks tests and all.

> ======================================================================
> > 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?
>
> I am using binascii.hexlify(buffer(obj)) as a simple way to look at the
> bytes of
> the memory block.
>
> I think that hexlify should be able to use any buffer object that has
> a readable memory block, not only those with charbuffers.
>
> The docs say that the binascii methods are used to "convert between binary
> and various ASCII-encoded binary representations".



Perhaps s# should be used instead since the docs say a read buffer can be
used for that.

> Plus, Thomas, you might want to change _SimpleCData if you want it to
> > truly suport char buffers.
>
> I did not implement that because the memory block contains binary data,
> not text.



OK.

-Brett
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/python-dev/attachments/20060608/28987d78/attachment.htm 


More information about the Python-Dev mailing list