struct.Struct random access

castironpi castironpi at gmail.com
Thu Aug 28 14:40:51 EDT 2008


On Aug 28, 1:59 am, Tim Roberts <t... at probo.com> wrote:
> castironpi <castiro... at gmail.com> wrote:
>
> >I'd like to seriously nominate this idea and get a considered opinion
> >on it.
>
> >struct.Struct lets you encode Python objects into structured memory.
> >It accepts a format string, and optionally a buffer and offset to/from
> >which to read/write the structure.  What do you think of random access
> >to the results?  To avoid Marc's concern about meaningless anonymous
> >record entries, model the constructor after 'namedtuple' type.
>
> >(unproduced)
> >>>> packer= struct.Struct( 'IIIf255p', 'i1 i2 i3 afloat name' )
> >>>> packer.pack_into( buf, off, 10, 20, 30, 0.5, 'abc' )
> >>>> packer.unpack_from( buf, off, 'i3' )
> >30
> >>>> packer.unpack_from( buf, off )
> >( 10, 20, 30, 0.5, 'abc' )
> >>>> packer.pack_into( buf, off, 'i1', 12 )
>
> What data type would you expect "buf" to be?  Your design requires it to be
> both an input and an output parameter.  Today's "struct" converts into and
> out of a string, and strings are immutable.  So, to continue with that
> standard, you would have to pass a string into "pack_into" and have the
> modified result returned as an output:
>
>     buf = packer.pack_into( None, 0, 10, 20, 30, 0.5, 'abc' )
>     buf = packer.pack_into( buf, 0, 'i1', 12 )
>
> In the end, I'm not sure you are really saving anything.
>
> >Even in sequential access speed benefits, by avoiding the construction
> >of n-1 objects.
>
> This is a fairly major change, because it requires a "struct.Struct" object
> to maintain state, something that the "struct" module currently does not
> do.
>
> In my personal opinion, this is a rather large and confusing change, for
> very little benefit.
> --
> Tim Roberts, t... at probo.com
> Providenza & Boekelheide, Inc.

CMIIW correct me if I'm wrong, I don't think that pack_into returns a
value the way that pack does.

The syntax is ambiguous in the case of two-element structs: are you
packing a new struct or assigning a field?  Maybe the field name needs
a keyword.  A field name can be a third argument in unpack_from
regardless, however.  Or use the field name as keyword:
strt.pack_into( buf, off, i1= 32 ).

I just tried an experiment with an Mmap and PyObject_AsWriteBuffer.
Mmaps could work but you would not be able to use arbitrary strings.
You would have to specially allocate a ctypes buffer with a size to
match the packed size of the structure.



More information about the Python-list mailing list