From: Raymond Hettinger Date: Mon, 7 Jan 2008 09:03:49 +0000 (+0000) Subject: Add another named tuple subclassing example. X-Git-Tag: v2.6a1~702 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dc55f35f387479888019538a429f38104a8bc3b0;p=python Add another named tuple subclassing example. --- diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index d7d1083738..564c45bb1b 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 d3f7b80caf..51184a430b 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())