[Python-ideas] Ordered storage of keyword arguments

Steven D'Aprano steve at pearwood.info
Sat Oct 30 11:58:23 CEST 2010

spir wrote:

> (**) I miss "free objects" in python for this reason -- people often use dicts instead. I'd like to be able to write: "return (color:c, position:p)", where the defined object is instance of Object directly, or maybe of Individual, meaning Object with a __dict__.
> class Individual:
>     def __init__ (self, **slots):
>         self.__dict__ = slots
>     def __repr__(self):
>         return "(%s)" % \
>             ' '.join("%s:%s" %(k,v) for (k,v) in self.__dict__.items())
> print Individual(a=135, d=100)  # (a:135 d:100)
> If only we had a literal notation for that :-) No more need of classes for singletons.

We almost do.

 >>> from collections import namedtuple as nt
 >>> nt("Individual", "a d")(a=135, d=100)
Individual(a=135, d=100)

Short enough to write in-line. Or you could do this:

 >>> Individual = nt("Individual", "a d")
 >>> Individual(99, 42)
Individual(a=99, d=42)

It shouldn't be hard to write a function similar to namedtuple that 
didn't require a declaration before hand, but picked up the field names 
from the keyword-only arguments given:

 >>> from collections import record  # say
 >>> record(a=23, b=42)
record(a=23, b=24)

I leave that as an exercise to the readers :)


More information about the Python-ideas mailing list