From: Raymond Hettinger Date: Mon, 7 Jan 2008 04:24:49 +0000 (+0000) Subject: Add subclassing example to docs for named tuples. X-Git-Tag: v2.6a1~705 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8e0072fec28e6c1a8398b12b5b40f82e878f8b9;p=python Add subclassing example to docs for named tuples. --- diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 0205cf1aa8..1f9e82dc70 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -510,15 +510,22 @@ When casting a dictionary to a named tuple, use the double-star-operator [#]_:: Point(x=11, y=22) Since a named tuple is a regular Python class, it is easy to add or change -functionality. For example, the display format can be changed by overriding -the :meth:`__repr__` method: +functionality with a subclass. Here is how to add a calculated field and +a custom fixed-width print format: :: - >>> Point = namedtuple('Point', 'x y') - >>> Point.__repr__ = lambda self: 'Point(%.3f, %.3f)' % self - >>> Point(x=11, y=22) - Point(11.000, 22.000) + >>> class Point(namedtuple('Point', 'x y')): + @property + def hypot(self): + return (self.x ** 2 + self.y ** 2) ** 0.5 + def __repr__(self): + return 'Point(x=%.3f, y=%.3f, hypot=%.3f)' % (self.x, self.y, self.hypot) + + >>> print Point(3, 4) + Point(x=3.000, y=4.000, hypot=5.000) + >>> Point(2, 5) + Point(x=2.000, y=5.000, hypot=5.385) Default values can be implemented by starting with a prototype instance and customizing it with :meth:`_replace`: diff --git a/Lib/collections.py b/Lib/collections.py index 0b86898502..1701952cde 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -116,8 +116,15 @@ if __name__ == '__main__': assert p == loads(dumps(p)) # test and demonstrate ability to override methods - Point.__repr__ = lambda self: 'Point(%.3f, %.3f)' % self - print p + class Point(namedtuple('Point', 'x y')): + @property + def hypot(self): + return (self.x ** 2 + self.y ** 2) ** 0.5 + def __repr__(self): + return 'Point(x=%.3f, y=%.3f, hypot=%.3f)' % (self.x, self.y, self.hypot) + + print Point(3, 4) + print Point(2, 5) import doctest TestResults = namedtuple('TestResults', 'failed attempted')