]> granicus.if.org Git - python/commitdiff
Add another named tuple subclassing example.
authorRaymond Hettinger <python@rcn.com>
Mon, 7 Jan 2008 09:03:49 +0000 (09:03 +0000)
committerRaymond Hettinger <python@rcn.com>
Mon, 7 Jan 2008 09:03:49 +0000 (09:03 +0000)
Doc/library/collections.rst
Lib/collections.py

index d7d1083738c2da5984484fcf0205f23a01b251ca..564c45bb1b540d254707acc25c47aeaeb024aa0d 100644 (file)
@@ -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`:
 
index d3f7b80caf8dccd541060e09da34fb540dfbe1bb..51184a430bd2457c55473ebd619c114b89808563 100644 (file)
@@ -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())