Struct class random access

C

castironpi

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
for the results?

(unproduced)30

Does this take a PEP, or just a patch submission?
 
M

Marc 'BlackJack' Rintsch

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
for the results?

(unproduced)
30

I don't like it for the same reason I don't like index access on tuples
or lists that represent a "record" -- the numbers are quite meaningless.
Names for the components result in much easier to understand source code,
so I would prefer to use `ctypes` or `construct` to create such a record.

Ciao,
Marc 'BlackJack' Rintsch
 
C

castironpi

I don't like it for the same reason I don't like index access on tuples
or lists that represent a "record" -- the numbers are quite meaningless.  
Names for the components result in much easier to understand source code,
so I would prefer to use `ctypes` or `construct` to create such a record.

Ciao,
        Marc 'BlackJack' Rintsch

I'm interested in the speed benefit, so you don't have to reconstruct
the entire 'record' just to read/write one 'field'. How in ctypes?
 
C

castironpi

I'm interested in the speed benefit, so you don't have to reconstruct
the entire 'record' just to read/write one 'field'.  How in ctypes?

Model the constructor after 'namedtuple' type.

(unproduced)( 10, 20, 30, 0.5, 'abc' )

You still get marginal speed benefit in sequential access. You avoid
the construction of n-1 objects.
 
M

Marc 'BlackJack' Rintsch

I'm interested in the speed benefit, so you don't have to reconstruct
the entire 'record' just to read/write one 'field'. How in ctypes?

Only the field accessed is converted.

Ciao,
Marc 'BlackJack' Rintsch
 
C

castironpi

Only the field accessed is converted.

Ciao,
        Marc 'BlackJack' Rintsch

I know that. I was asking how to write 'unpack_from( buf, off, 2 )',
when buf is a non-ctypes buffer.
 
C

castironpi

I know that.  I was asking how to write 'unpack_from( buf, off, 2 )',
when buf is a non-ctypes buffer.

The code with ctypes is more elegant than I thought.

from ctypes import *
prototype= PYFUNCTYPE( c_int, py_object, POINTER(c_void_p),
POINTER(c_uint) )
PyObject_AsWriteBuffer= prototype( ( "PyObject_AsWriteBuffer",
pythonapi ) )
def refas( buf, offset, tp ):
''' return an instance of |tp| that refers to |offset| bytes into
buffer |buf| '''
_b, _s= c_void_p(0), c_uint(0)
PyObject_AsWriteBuffer( buf, byref(_b), byref(_s) ) #should return
0
c= cast( _b.value+ offset, POINTER( tp ) )
return c.contents

'tp' can be any class that is derived from ctypes.Structure. 'buf'
can be any object that supports the buffer protocol, including
'mmap'. Remember when mapping pointers to store offsets, not memory
addresses.

I'd like to know how supported this is considered to be, across
platforms and versions. Can I rely on this in the future?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top