From e1655088ca65644312f02a147a0f9ad968cde2d9 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 10 Jan 2008 19:15:10 +0000 Subject: [PATCH] Examples for named tuple subclassing should include __slots__ --- Doc/library/collections.rst | 7 ++++--- Lib/collections.py | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index c3839433cbb..b276ab02d9c 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -513,23 +513,24 @@ functionality with a subclass. Here is how to add a calculated field and a fixed-width print format:: >>> class Point(namedtuple('Point', 'x y')): + ... __slots__ = () ... @property ... def hypot(self): ... return (self.x ** 2 + self.y ** 2) ** 0.5 ... def __str__(self): ... return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot) - >>> for p in Point(3,4), Point(14,5), Point(9./7,6): + >>> for p in Point(3, 4), Point(14, 5/7.): ... print p Point: x= 3.000 y= 4.000 hypot= 5.000 - Point: x=14.000 y= 5.000 hypot=14.866 - Point: x= 1.286 y= 6.000 hypot= 6.136 + Point: x=14.000 y= 0.714 hypot=14.018 Another use for subclassing is to replace performance critcal methods with faster versions that bypass error-checking and that localize variable access:: class Point(namedtuple('Point', 'x y')): + __slots__ = () _make = classmethod(tuple.__new__) def _replace(self, _map=map, **kwds): return self._make(_map(kwds.get, ('x', 'y'), self)) diff --git a/Lib/collections.py b/Lib/collections.py index a234b44902c..47b0397d0b8 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -118,17 +118,19 @@ if __name__ == '__main__': # test and demonstrate ability to override methods class Point(namedtuple('Point', 'x y')): + __slots__ = () @property def hypot(self): return (self.x ** 2 + self.y ** 2) ** 0.5 def __str__(self): return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot) - for p in Point(3,4), Point(14,5), Point(9./7,6): + for p in Point(3, 4), Point(14, 5/7.): print p class Point(namedtuple('Point', 'x y')): 'Point class with optimized _make() and _replace() without error-checking' + __slots__ = () _make = classmethod(tuple.__new__) def _replace(self, _map=map, **kwds): return self._make(_map(kwds.get, ('x', 'y'), self))