extend Python namedtuple with many @properties?

namedtuple, properties, python

Solution

The answer to your question

How can namedtuples be extended or subclassed with additional `@properties` ?

is: exactly the way you're doing it! What error are you getting? To see a simpler case,

>>> class x(collections.namedtuple('y', 'a b c')):
...   @property
...   def d(self): return 23
... 
>>> a=x(1, 2, 3)
>>> a.d
23
>>> 

Problem

How can namedtuples be extended or subclassed with many additional @properties ? For a few, one can just write the text below; but there are many, so I'm looking for a generator or property factory. One way would be to generate text from `_fields` and exec it; another would be an add_fields with the same effect at runtime. (My @props are to get rows and fields in a database scattered across several tables, so that `rec.pname` is `persontable[rec.personid].pname`; but namedtuples-with-smart-fields would have other uses too.) ``` """ extend namedtuple with many @properties ? """ from collections import namedtuple Person = namedtuple( "Person", "pname paddr" ) # ... persontable = [ Person( "Smith", "NY" ), Person( "Jones", "IL" ) ] class Top( namedtuple( "Top_", "topid amount personid" )): """ @property .person -> persontable[personid] .pname -> person.pname ... """ __slots__ = () @property def person(self): return persontable[self.personid] # def add_fields( self, Top.person, Person._fields ) with the same effect as these ? @property def pname(self): return self.person.pname @property def paddr(self): return self.person.paddr # ... many more rec = Top( 0, 42, 1 ) print rec.person, rec.pname, rec.paddr ```

Original source