Composing namedtuple from namedtuples
2017 November 2
One namedtuples is great, two better. But how do I combine the two namedtuples to get the best nametuple of all?
For example, how to combine the Square class with Color class?
Square = namedtuple('Square', 'x0 y0 x1 y1') Color = namedtuple('Color', 'r g b') # The opposite of DRY principle - WET (we enjoy typing) principle ColoredSquare = namedtupe('ColoredSquare', 'x0 y0 x1 y1 r g b')
I don’t like this solution, because there are clearly something to reuse in Square and Color , and also, it isn’t fun to call ColoredSquare ‘s init function that has 7 arguments. The alternative might be writing a custom class that takes Square and Color as arguments of the init function, but then we lost all the benefits from using namedtuples. (TODO add a link of something to support this statement.)
So, here’s the recipe:
class ColoredSquare(namedtuple('ColoredSquare', Square._fields + Color._fields)): @classmethod def from_(cls, square: Square, color: Color): return cls(*square, *color) my_square = ColoredSquare.from_( square=Square(0, 0, 1, 1), color=Color(100, 100, 100)) >>> my_square ColoredSquare(x0=0, y0=0, x1=1, y1=1, r=100, g=100, b=100)
Let me know what you think! Please share or like this post if you think it’s helpful!