[Python-ideas] namedtuple() subclasses again

Jan Kaliszewski zuo at chopin.edu.pl
Fri Mar 25 15:06:37 CET 2011


Hello,
Another thoughts (and use cases) about namedtuple-DRY-matter and (what
is more important) subclassing namedtuple() classes:
Quite often I need to create my own named tuple class(es) with some
additional methods or modifications of existing ones (most often: a
custom version of __repr__()). Now I must write something like:
 _MyNamedTupleBase = namedtuple('MyNamedTuple',
 ('one_field',
 'another_field',
 'and_another_one'))
 class MyNamedTuple(_MyNamedTupleBase):
 def __repr__(self):
 "My sophisticated __repr__()"
 # and e.g. some new methods...
...or:
 class MyNamedTuple(namedtuple('MyNamedTuple',
 ('one_field',
 'another_field',
 'and_another_one'))):
 def __repr__(self):
 "My sophisticated __repr__()"
 # and e.g. some new methods...
It would be very nice to be able to do it in such a way:
 class MyNamedTuple(namedtuple.abc):
 _fields = (
 'one_field',
 'another_field',
 'and_another_one',
 )
 def __repr__(self):
 "My sophisticated __repr__()"
 # and e.g. some new methods...
...and especially:
 class MyAbstractNamedTuple(namedtuple.abc):
 def __repr__(self):
 "My sophisticated __repr__()"
 # and e.g. some new methods...
 
 class MyNamedTupleA(MyAbstractNamedTuple):
 _fields = 'a b c'
 class MyNamedTupleB(MyAbstractNamedTuple):
 _fields = (
 'one_field',
 'another_field',
 'and_another_one',
 )
(Please note that _fields is a part of the public API of named tuples).
Implementation would be easy to explain (and to do; actually I have an
outline in my head). The type (metaclass) of namedtuple.abc would be a
subclass of abc.ABCMeta and would also act (by ABC registration
mechanism) as an abstract base for all named tuples and structsequences
like sys.version_info. So all these expressions would be True:
>>> isinstance(namedtuple('Foo', 'x y z'), namedtuple.abc)
>>> isinstance(sys.version_info, namedtuple.abc)

And obviously:
>>> isinstance(MyNamedTuple, namedtuple.abc) # referiring to the above examples

What do you think about the idea?
Regards.
*j


More information about the Python-ideas mailing list

AltStyle によって変換されたページ (->オリジナル) /