[Python-ideas] recorarray: a mutable alternative to namedtuple
Andrew Barnert
abarnert at yahoo.com
Sat Mar 28 00:13:46 CET 2015
On Mar 27, 2015, at 06:22, Joao S. O. Bueno <jsbueno at python.org.br> wrote:
>
> On 27 March 2015 at 01:40, Andrew Barnert
> <abarnert at yahoo.com.dmarc.invalid> wrote:
>> But how is being "an array of objects" any different from what a tuple,
>> list, array.array, bytearray, bytes, str, etc. already are? What's
>> specifically array-like about this type as opposed to all of those? And
>> what's specifically record-like about your type compared to namedtuple,
>> Struct, or SimpleNamespace?
>
> Acutally, on my understanding, the request on this thread is for
> something that is quite concrete,
> existing in other languages, and that can be done in Python in a few
> lines, but is not in
> the stdlib:
>
> The Python equivalent of a C Struct.
But a C struct is not a subtype of, or substitutable for, a C array. It's not indexable. And the same is true with the equivalents in other languages. In fact, the dichotomy between struct--heterogeneous collection of fixed named fields--and array--homogeneous collection of indexed fields--goes back way before C. So, if you want the equivalent of a C struct, there's no reason to make it an iterable in Python.
And a class already is the Python of a C struct, it's just that it can do _more_ than a C struct. A language like C++ that wants to share code and values with C has to bend over backward to make it possible to write a C++ struct (or class) that doesn't use any of its extra features and is therefore exactly equivalent to a C struct, but Python has no need for that. (Except when you actually do want to share values with C code--but for that case, we've got ctypes.Struct, which is exactly what you want in that situation.)
> Just that.
> An easy to create class, with named fields,
Which is easy to do: just create a class, and create its fields in the __init__ method (or, in some cases, it's acceptable to use class attributes as "default values" for instance attributes).
> with possible
> type-enforcement for those fields.
Of course namedtuple doesn't have type-enforcement for the fields.
I'm not sure whether you're talking about MyPy static type checking, or runtime checking, but either way, it's easier to add onto a regular class than to a namedtuple-like class factory.
> Or maybe it _does_ exist in Python, and it is a matter of having a
> nice example in the docs:
> for example a "blank" class with "__slots__" would do it.
A blank class without __slots__ can also do it. There are times when __slots__ are useful, but usually you're fine with just a plain __dict__. Encouraging people to use it when they have no need for it just because it's more like idiomatic C would be a bad idea. (It's like encouraging people to use @property to get something more like idiomatic .NET or ObjC, when actually they should just be writing idiomatic Python and using attributes directly.)
> Or a blank class with slots that could serialize and deserialize
> itself to a sequence
> in a seamless way.
Why do you want to serialize and deserialize to a sequence? A C struct can't do that, and neither can equivalent types in other languages.
> class Base:
> __slots__ = ()
> def __init__(self, seq=None):
> if not seq: return
> for attr, val in zip(self.slots, seq):
> setattr(self, attr, val)
> def __iter__(self):
> for attr in self.__slots__:
> yield getattr(self, attr)
>
>
> def NamedList(name, fields):
> ... # split string with space separated fields, and other niceities here
> return type(name, (Base,), dict(__slots__=fields))
>
> And 10-15 more lines if one wants type-checking, default values,
> __repr__ into that.
Default values and __repr__ are _also_ not part of a C struct. So, again, if what you're looking for is the equivalent of a C struct, you can replace all of the above with:
def Base: pass
If you want other features that C structs don't have, then yes, you may have to write them, but the same is true in C (and, in fact, it's clumsier and more difficult in C).
> Ithink getting a proper recipe for this, and
> publicizing it on the documentation ecosystem is enough - maybe a
> Pypi module adding some more goodies - and if that would get any
> traction - the usual consideration for inclusion could apply.
More information about the Python-ideas
mailing list