From dc55f35f387479888019538a429f38104a8bc3b0 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Mon, 7 Jan 2008 09:03:49 +0000 Subject: Add another named tuple subclassing example. --- Doc/library/collections.rst | 8 ++++++++ Lib/collections.py | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index d7d1083..564c45b 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -527,6 +527,14 @@ a fixed-width print format: Point(x=2.000, y=5.000, hypot=5.385) Point(x=1.286, y=6.000, hypot=6.136) +Another use for subclassing is to replace performance critcal methods with +faster versions that bypass error-checking and localize variable access: + + >>> class Point(namedtuple('Point', 'x y')): + _make = classmethod(tuple.__new__) + def _replace(self, _map=map, **kwds): + return self._make(_map(kwds.pop, ('x', 'y'), self)) + 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 d3f7b80..51184a4 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -125,6 +125,14 @@ if __name__ == '__main__': print Point(3, 4),'\n', Point(2, 5), '\n', Point(9./7, 6) + class Point(namedtuple('Point', 'x y')): + 'Point class with optimized _make() and _replace() without error-checking' + _make = classmethod(tuple.__new__) + def _replace(self, _map=map, **kwds): + return self._make(_map(kwds.pop, ('x', 'y'), self)) + + print Point(11, 22)._replace(x=100) + import doctest TestResults = namedtuple('TestResults', 'failed attempted') print TestResults(*doctest.testmod()) -- cgit v0.12