Merged revisions 59541-59561 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r59544 | raymond.hettinger | 2007-12-18 01:13:45 +0100 (Tue, 18 Dec 2007) | 1 line

  Add more namedtuple() test cases.  Neaten the code and comments.
........
  r59545 | christian.heimes | 2007-12-18 04:38:03 +0100 (Tue, 18 Dec 2007) | 3 lines

  Fixed for #1601: IDLE not working correctly on Windows (Py30a2/IDLE30a1)

  Amaury's ideas works great. Should we build the Python core with WINVER=0x0500 and _WIN32_WINNT=0x0500, too?
........
  r59546 | christian.heimes | 2007-12-18 10:00:13 +0100 (Tue, 18 Dec 2007) | 1 line

  Make it a bit easier to test Tcl/Tk and idle from a build dir.
........
  r59547 | christian.heimes | 2007-12-18 10:12:10 +0100 (Tue, 18 Dec 2007) | 1 line

  Removed several unused files from the PCbuild9 directory. They are relics from the past.
........
  r59548 | raymond.hettinger | 2007-12-18 19:26:18 +0100 (Tue, 18 Dec 2007) | 29 lines

  Speed-up dictionary constructor by about 10%.

  New opcode, STORE_MAP saves the compiler from awkward stack manipulations
  and specializes for dicts using PyDict_SetItem instead of PyObject_SetItem.

  Old disassembly:
                0 BUILD_MAP                0
                3 DUP_TOP
                4 LOAD_CONST               1 (1)
                7 ROT_TWO
                8 LOAD_CONST               2 ('x')
               11 STORE_SUBSCR
               12 DUP_TOP
               13 LOAD_CONST               3 (2)
               16 ROT_TWO
               17 LOAD_CONST               4 ('y')
               20 STORE_SUBSCR

  New disassembly:
                0 BUILD_MAP                0
                3 LOAD_CONST               1 (1)
                6 LOAD_CONST               2 ('x')
                9 STORE_MAP
               10 LOAD_CONST               3 (2)
               13 LOAD_CONST               4 ('y')
               16 STORE_MAP
........
  r59549 | thomas.heller | 2007-12-18 20:00:34 +0100 (Tue, 18 Dec 2007) | 2 lines

  Issue #1642: Fix segfault in ctypes when trying to delete attributes.
........
  r59551 | guido.van.rossum | 2007-12-18 21:10:42 +0100 (Tue, 18 Dec 2007) | 2 lines

  Issue #1645 by Alberto Bertogli.  Fix a comment.
........
  r59553 | raymond.hettinger | 2007-12-18 22:24:09 +0100 (Tue, 18 Dec 2007) | 12 lines

  Give meaning to the oparg for BUILD_MAP:  estimated size of the dictionary.

  Allows dictionaries to be pre-sized (upto 255 elements) saving time lost
  to re-sizes with their attendant mallocs and re-insertions.

  Has zero effect on small dictionaries (5 elements or fewer), a slight
  benefit for dicts upto 22 elements (because they had to resize once
  anyway), and more benefit for dicts upto 255 elements (saving multiple
  resizes during the build-up and reducing the number of collisions on
  the first insertions).  Beyond 255 elements, there is no addional benefit.
........
  r59554 | christian.heimes | 2007-12-18 22:56:09 +0100 (Tue, 18 Dec 2007) | 1 line

  Fixed #1649: IDLE error: dictionary changed size during iteration
........
  r59557 | raymond.hettinger | 2007-12-18 23:21:27 +0100 (Tue, 18 Dec 2007) | 1 line

  Simplify and speedup _asdict() for named tuples.
........
  r59558 | christian.heimes | 2007-12-19 00:22:54 +0100 (Wed, 19 Dec 2007) | 3 lines

  Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).

  The patch unifies float("inf") and repr(float("inf")) on all platforms.
........
  r59559 | raymond.hettinger | 2007-12-19 00:51:15 +0100 (Wed, 19 Dec 2007) | 1 line

  Users demand iterable input for named tuples. The author capitulates.
........
  r59560 | raymond.hettinger | 2007-12-19 01:21:06 +0100 (Wed, 19 Dec 2007) | 1 line

  Beef-up tests for dict literals
........
  r59561 | raymond.hettinger | 2007-12-19 01:27:21 +0100 (Wed, 19 Dec 2007) | 1 line

  Zap a duplicate line
........
diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst
index 1982187..e01c52e 100644
--- a/Doc/library/collections.rst
+++ b/Doc/library/collections.rst
@@ -421,27 +421,31 @@
 
            __slots__ = ()
 
-           _fields = ('x', 'y')
-
            def __new__(cls, x, y):
                return tuple.__new__(cls, (x, y))
 
+           _cast = classmethod(tuple.__new__)
+
            def __repr__(self):
                return 'Point(x=%r, y=%r)' % self
 
-           def _asdict(self):
+           def _asdict(t):
                'Return a new dict which maps field names to their values'
-               return dict(zip(('x', 'y'), self))
+               return {'x': t[0], 'y': t[1]}
 
            def _replace(self, **kwds):
                'Return a new Point object replacing specified fields with new values'
-               return Point(*map(kwds.get, ('x', 'y'), self))
+               return Point._cast(map(kwds.get, ('x', 'y'), self))
+
+           @property
+           def _fields(self):
+               return ('x', 'y')
 
            x = property(itemgetter(0))
            y = property(itemgetter(1))
 
    >>> p = Point(11, y=22)     # instantiate with positional or keyword arguments
-   >>> p[0] + p[1]             # indexable like the regular tuple (11, 22)
+   >>> p[0] + p[1]             # indexable like the plain tuple (11, 22)
    33
    >>> x, y = p                # unpack like a regular tuple
    >>> x, y
@@ -456,34 +460,31 @@
 
    EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
 
-   from itertools import starmap
    import csv
-   for record in starmap(EmployeeRecord, csv.reader(open("employees.csv", "rb"))):
+   for emp in map(EmployeeRecord._cast, csv.reader(open("employees.csv", "rb"))):
        print(emp.name, emp.title)
 
    import sqlite3
    conn = sqlite3.connect('/companydata')
    cursor = conn.cursor()
    cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
-   for emp in starmap(EmployeeRecord, cursor.fetchall()):
+   for emp in map(EmployeeRecord._cast, cursor.fetchall()):
        print emp.name, emp.title
 
-When casting a single record to a named tuple, use the star-operator [#]_ to unpack
-the values::
+In addition to the methods inherited from tuples, named tuples support
+three additonal methods and a read-only attribute.
+
+.. method:: namedtuple._cast(iterable)
+
+   Class method returning a new instance taking the positional arguments from the *iterable*.
+   Useful for casting existing sequences and iterables to named tuples:
+
+::
 
    >>> t = [11, 22]
-   >>> Point(*t)               # the star-operator unpacks any iterable object
+   >>> Point._cast(t)
    Point(x=11, y=22)
 
-When casting a dictionary to a named tuple, use the double-star-operator::
-
-   >>> d = {'x': 11, 'y': 22}
-   >>> Point(**d)
-   Point(x=11, y=22)
-
-In addition to the methods inherited from tuples, named tuples support
-two additonal methods and a read-only attribute.
-
 .. method:: somenamedtuple._asdict()
 
    Return a new dict which maps field names to their corresponding values:
@@ -529,6 +530,12 @@
     >>> getattr(p, 'x')
     11
 
+When casting a dictionary to a named tuple, use the double-star-operator [#]_::
+
+   >>> d = {'x': 11, 'y': 22}
+   >>> Point(**d)
+   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:
@@ -551,5 +558,5 @@
 
 .. rubric:: Footnotes
 
-.. [#] For information on the star-operator see
+.. [#] For information on the double-star-operator see
    :ref:`tut-unpacking-arguments` and :ref:`calls`.