[Python-Dev] from tuples to immutable dicts
Martin v. Loewis
martin@v.loewis.de
23 Nov 2002 12:19:05 +0100
Armin Rigo <arigo@tunes.org> writes:
> Here is a related suggestion: enhancing or subclassing tuples to
> allow items to be named. Example
> syntax:
>
> (1,2,c=3,d=4)
>
> would build the 4-tuple (1,2,3,4) with names on the last two items.
While I agree on the need for a struct-like type, I'm strongly opposed
to adding new syntax, or even make it a builtin type (i.e. one that is
referenced from __builtins__).
Provide such a type using the standard language mechanisms.
> I believe that it fills a hole between very small structures
> (e.g. (x,y) coordinates for points) and large structures naturally
> implemented as classes: it allows small structures to grow a bit
> without turning into an obscure 5- or 10-tuple. As a typical
> example, consider the os.stat() trick: it currently returns an
> object that behaves like a 10-tuple, but whose items can also be
> read via attributes for the sake of clarity.
I think the structseq type is a good starting point.
Fred once had a plan to expose structseqs to Python, to allow the
creation of new structs in Python. I was suggesting that there should
be a method new.struct_seq, which is called as
struct_seq(name, doc, n_in_sequence, (fields))
where fields is a list of (name,doc) tuples. The resulting thing would
be similar to os.stat_result: you need to call it with the mandatory
fields in sequence, and can call it with the optional fields by
keyword argument.
> * use 'tuple' or a new subtype 'namedtuple' or 'structure'?
No new builtins at all, please.
> * the suggested syntax emphasis the use of strings for the keys, but
> the constructor could be more general, taking arbitrary hashable
> values:
YAGNI.
> * how do we read the key names?
You can currently get them from the type's __dict__, although this
contains more information than you want.
However, what do you need the key names for?
> * shoud name collisions be allowed inside a namedtuple?
You mean, two fields with the same name? No.
> * what about * and ** call syntaxes?
Irrelevant, since syntax extensions are not acceptable.
> * dissymetries between namedtuples and dicts: operations like 'in'
> and iteration operates on values in tuples, but on keys in dicts...
A struct really is a sequence, not a mapping.
Regards,
Martin