[Python-ideas] recordclass: a mutable alternative to namedtuple

Zaur Shibzukhov szport at gmail.com
Wed Apr 1 15:55:50 CEST 2015


It is possible that this is recordclass 
<https://pypi.python.org/pypi/recordclass>  <wink>
A short example 
<http://nbviewer.ipython.org/urls/bitbucket.org/intellimath/recordclass/raw/default/examples/what_is_recordclass.ipynb> 
to illustrate that fact.

суббота, 28 марта 2015 г., 16:37:40 UTC+3 пользователь Steven D'Aprano 
написал:
>
> On Fri, Mar 27, 2015 at 04:13:46PM -0700, Andrew Barnert wrote: 
> > On Mar 27, 2015, at 06:22, Joao S. O. Bueno <jsb... at python.org.br 
> <javascript:>> wrote: 
> [...] 
> > > 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. 
>
> Joao said "The Python equivalent of a C struct", not "a C struct". 
> Python is not C, and Python data types are not limited to what C does. 
> Python strings aren't limited to C null-delimited strings, and Python 
> ints aren't limited to what C ints can do. 
>
> I think the original thread was quite explicit about what is wanted: 
> something like a mutable equivalent to namedtuple. Namedtuples are used 
> in Python where C would use a struct, or Pascal a record, except that 
> namedtuples (being tuples) are immutable. I think it's quite reasonable 
> to want a mutable version. 
>
> Effectively, namedtuple is just a convenience function for wrapping up a 
> bunch of nice-to-have but not essential functionality around an 
> immutable struct. Python got by with unnamed tuples for over a decade, 
> so it's not like we *have* to have namedtuples. But having got them, 
> would we go back to using regular tuples as a struct? Hell no. Having 
> named fields is so much better. 
>
>
>
> > And a class already is the Python of a C struct, it's just that it can 
> > do _more_ than a C struct. 
>
> This is why it is unfair to insist that a Python equivalent of a C 
> struct be limited to what C structs do. 
>
>
> > > 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). 
>
> If this is so easy, why we have namedtuple *and* SimpleNamespace 
> in the standard library. Are they both mistakes? 
>
> SimpleNamespace is especially interesting. The docs say: 
>
> "However, for a structured record type use namedtuple() instead." 
>
> https://docs.python.org/3/library/types.html#types.SimpleNamespace 
>
>
> which is great if you want an *immutable* structured record type, but 
> not if you want a mutable one. 
>
> Which brings us back to where this thread started: a request for a 
> mutable version of namedtuple. That's trickier than namedtuple, because 
> we don't have a mutable version of a tuple to inherit from. Lists won't 
> do the job, because they have a whole lot of functionality that are 
> inappropriate, e.g. sort, reverse, pop methods. 
>
> That makes it harder to create a mutable structured record type, not 
> simpler. 
>
> Think about the functional requirements: 
>
> - it should be semantically a struct, not a list or array; 
>
> - with a fixed set of named fields; 
>
> - fields should be ordered: a record with fields foo and bar is not the 
> same as a record with fields bar and foo; 
>
> - accessing fields by index would be a Nice To Have, but not essential; 
>
> - but iteration is essential, for sequence unpacking; 
>
> - values in the fields must be mutable; 
>
> - it should support equality, but not hashing (since it is mutable); 
>
> - it must have a nice repr and/or str; 
>
> - being mutable, it may directly or indirectly contain a reference to 
> itself (e.g. x.field = x) so it needs to deal with that correctly; 
>
> - support for pickle; 
>
> - like namedtuple, it may benefit from a handful of methods such as 
> '_asdict', '_fields', '_make', '_replace' or similar. 
>
>
> Does this sound easy to write? Well, sure, in the big picture, it's 
> hardly a 100,000 line application. But it's not a trivial class. 
>
>
>
> -- 
> Steve 
> _______________________________________________ 
> Python-ideas mailing list 
> Python... at python.org <javascript:> 
> https://mail.python.org/mailman/listinfo/python-ideas 
> Code of Conduct: http://python.org/psf/codeofconduct/ 
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20150401/91b3c7f7/attachment.html>


More information about the Python-ideas mailing list