One of the few data types from C that I miss when writing Python code is
struct
s. The simplest replacement is dictionaries, but that means you have to write
thing['field']
instead of
thing.field
. I can't stand that (it's the extra characters).
If you want
thing.field
syntax in Python, you need an object. The simplest C
struct
emulation is just to use a blank object and set fields on it:
class MyStruct: pass ms = MyStruct() ms.foo = 10 ms.bar = "abc"
Some people will say that this is an abuse of objects, since they don't have any code, just data. I say to heck with such people; sometimes all I want is data.
(Avoid the temptation to just use '
ms = object()
', because it hurts your ability to tell different types of structs apart via introspection.)
Initialization this way is tedious, though. We can do it easier and more compactly by using keyword arguments when we create the object, with a little help from the class. Like so:
class Struct:
def __init__(self, **kwargs):
for k, v in kwargs.items():
setattr(self, k, v)
class MyStruct(Struct):
pass
ms = MyStruct(foo = 10, bar = "abc")
(And look, now our objects have some code.)
It's possible to write the
__init__
function as '
self.__dict__.update(kwargs)
', but that is fishing a little too much into the implementation of objects for me. I would rather use the explicit setattr loop just to be clear about what's going on.
(I am absolutely sure people have been using this idiom for years before I got here.)
Sidebar: dealing with packed binary data
If you need to deal with packed binary data in Python, you want the struct module .
This is a much better tool than C has, because
struct
s are not good for this (contrary to what some people think);
struct
s do not actually fully specify the memory layout. C compilers are free to insert padding to make field access more efficient, which makes
struct
memory layout machine and compiler dependent.
(I sometimes find it ironic that supposedly 'high level' languages like Python and Perl have better tools to deal with binary structures than 'low level' C.)