]> granicus.if.org Git - python/commitdiff
merge from trunk
authorBenjamin Peterson <benjamin@python.org>
Sat, 11 Oct 2008 00:49:57 +0000 (00:49 +0000)
committerBenjamin Peterson <benjamin@python.org>
Sat, 11 Oct 2008 00:49:57 +0000 (00:49 +0000)
40 files changed:
Doc/Makefile
Doc/c-api/init.rst
Doc/conf.py
Doc/contents.rst
Doc/library/ftplib.rst
Doc/library/functions.rst
Doc/library/sqlite3.rst
Doc/library/subprocess.rst
Doc/reference/simple_stmts.rst
Doc/tools/sphinxext/download.html
Doc/tools/sphinxext/indexcontent.html
Doc/tools/sphinxext/layout.html
Doc/whatsnew/2.2.rst
Doc/whatsnew/2.3.rst
Doc/whatsnew/2.4.rst
Doc/whatsnew/2.5.rst
Doc/whatsnew/2.6.rst
Doc/whatsnew/2.7.rst [new file with mode: 0644]
Doc/whatsnew/3.0.rst
Doc/whatsnew/index.rst [new file with mode: 0644]
Lib/optparse.py
Lib/test/test_atexit.py
Lib/test/test_bisect.py
Lib/test/test_datetime.py
Lib/test/test_dbm.py
Lib/test/test_docxmlrpc.py
Lib/test/test_set.py
Mac/BuildScript/build-installer.py
Makefile.pre.in
Modules/_bisectmodule.c
Modules/_codecsmodule.c
Modules/cjkcodecs/multibytecodec.c
Modules/posixmodule.c
Objects/dictobject.c
Objects/floatobject.c
Objects/listobject.c
Objects/setobject.c
Objects/tupleobject.c
Objects/unicodeobject.c
setup.py

index 77b84f5670d4faf09a87036db7de1e581cd1a789..81ae419ece9cf7c74f094a829cdb24e84adfc17b 100644 (file)
@@ -111,7 +111,7 @@ dist:
 
        # archive the HTML
        make html
-       cp -a build/html dist/python$(DISTVERSION)-docs-html
+       cp -pPR build/html dist/python$(DISTVERSION)-docs-html
        tar -C dist -cf dist/python$(DISTVERSION)-docs-html.tar python$(DISTVERSION)-docs-html
        bzip2 -9 -k dist/python$(DISTVERSION)-docs-html.tar
        (cd dist; zip -q -r -9 python$(DISTVERSION)-docs-html.zip python$(DISTVERSION)-docs-html)
@@ -120,7 +120,7 @@ dist:
 
        # archive the text build
        make text
-       cp -a build/text dist/python$(DISTVERSION)-docs-text
+       cp -pPR build/text dist/python$(DISTVERSION)-docs-text
        tar -C dist -cf dist/python$(DISTVERSION)-docs-text.tar python$(DISTVERSION)-docs-text
        bzip2 -9 -k dist/python$(DISTVERSION)-docs-text.tar
        (cd dist; zip -q -r -9 python$(DISTVERSION)-docs-text.zip python$(DISTVERSION)-docs-text)
index dff1f4d4d1b782adf71d2ff65399b4382610dc76..89bcff3237cd398898f00f816837d94bac23cf9f 100644 (file)
@@ -744,11 +744,11 @@ created.
    :cmacro:`Py_END_ALLOW_THREADS` macros is acceptable.
 
    The return value is an opaque "handle" to the thread state when
-   :cfunc:`PyGILState_Acquire` was called, and must be passed to
+   :cfunc:`PyGILState_Ensure` was called, and must be passed to
    :cfunc:`PyGILState_Release` to ensure Python is left in the same state. Even
    though recursive calls are allowed, these handles *cannot* be shared - each
-   unique call to :cfunc:`PyGILState_Ensure` must save the handle for its call to
-   :cfunc:`PyGILState_Release`.
+   unique call to :cfunc:`PyGILState_Ensure` must save the handle for its call
+   to :cfunc:`PyGILState_Release`.
 
    When the function returns, the current thread will hold the GIL. Failure is a
    fatal error.
index 2be0f19c6d705d87adb521dec55817eb35cff45a..014de27903103320c86b30520e64b8952041762a 100644 (file)
@@ -41,13 +41,6 @@ today_fmt = '%B %d, %Y'
 
 # List of files that shouldn't be included in the build.
 unused_docs = [
-    'whatsnew/2.0',
-    'whatsnew/2.1',
-    'whatsnew/2.2',
-    'whatsnew/2.3',
-    'whatsnew/2.4',
-    'whatsnew/2.5',
-    'whatsnew/2.6',
     'maclib/scrap',
     'library/xmllib',
     'library/xml.etree',
index 28384c610780cc5f89efe8ed1f817f09bf0ac9cc..8b99d0ee11949a92bacd1a0d7a9ab2cc3b9cf697 100644 (file)
@@ -4,7 +4,7 @@
 
 .. toctree::
 
-   whatsnew/3.0.rst
+   whatsnew/index.rst
    tutorial/index.rst
    using/index.rst
    reference/index.rst
index d4f8888ec712ccc44d67b652ad8f7e289dc505c5..b543294d377ac5ce49ab2af802913a96e190e12d 100644 (file)
@@ -299,7 +299,7 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
 .. method:: FTP.quit()
 
    Send a ``QUIT`` command to the server and close the connection. This is the
-   "polite" way to close a connection, but it may raise an exception of the server
+   "polite" way to close a connection, but it may raise an exception if the server
    responds with an error to the ``QUIT`` command.  This implies a call to the
    :meth:`close` method which renders the :class:`FTP` instance useless for
    subsequent calls (see below).
index ac255102acfa670be374455ea88fcf6d677ba528..818ce4571cadee9ac0812c56a3c2b110cba14417 100644 (file)
@@ -22,9 +22,8 @@ are always available.  They are listed here in alphabetical order.
    The function is invoked by the :keyword:`import` statement.  It mainly exists
    so that you can replace it with another function that has a compatible
    interface, in order to change the semantics of the :keyword:`import`
-   statement. See also the built-in module :mod:`imp`, which
-   defines some useful operations out of which you can build your own
-   :func:`__import__` function.
+   statement.  See the built-in module :mod:`imp`, which defines some useful
+   operations out of which you can build your own :func:`__import__` function.
 
    For example, the statement ``import spam`` results in the following call:
    ``__import__('spam', globals(), locals(), [], -1)``; the statement
@@ -1201,6 +1200,18 @@ are always available.  They are listed here in alphabetical order.
    care about trailing, unmatched values from the longer iterables.  If those
    values are important, use :func:`itertools.zip_longest` instead.
 
+   :func:`zip` in conjunction with the ``*`` operator can be used to unzip a
+   list::
+
+      >>> x = [1, 2, 3]
+      >>> y = [4, 5, 6]
+      >>> zipped = zip(x, y)
+      >>> zipped
+      [(1, 4), (2, 5), (3, 6)]
+      >>> x2, y2 = zip(*zipped)
+      >>> x == x2, y == y2
+      True
+
 
 .. rubric:: Footnotes
 
index 3e3facaba9b2fc8e77b31ff11e8d1cf8ade0d20e..8ffbce39ef4a7eb4cc49460182bc9b85bb28e981 100644 (file)
@@ -25,7 +25,7 @@ represents the database.  Here the data will be stored in the
 You can also supply the special name ``:memory:`` to create a database in RAM.
 
 Once you have a :class:`Connection`, you can create a :class:`Cursor`  object
-and call its :meth:`execute` method to perform SQL commands::
+and call its :meth:`~Cursor.execute` method to perform SQL commands::
 
    c = conn.cursor()
 
@@ -50,7 +50,7 @@ is insecure; it makes your program vulnerable to an SQL injection attack.
 
 Instead, use the DB-API's parameter substitution.  Put ``?`` as a placeholder
 wherever you want to use a value, and then provide a tuple of values as the
-second argument to the cursor's :meth:`execute` method.  (Other database modules
+second argument to the cursor's :meth:`~Cursor.execute` method.  (Other database modules
 may use a different placeholder, such as ``%s`` or ``:1``.) For example::
 
    # Never do this -- insecure!
@@ -69,8 +69,8 @@ may use a different placeholder, such as ``%s`` or ``:1``.) For example::
        c.execute('insert into stocks values (?,?,?,?,?)', t)
 
 To retrieve data after executing a SELECT statement, you can either treat the
-cursor as an :term:`iterator`, call the cursor's :meth:`fetchone` method to
-retrieve a single matching row, or call :meth:`fetchall` to get a list of the
+cursor as an :term:`iterator`, call the cursor's :meth:`~Cursor.fetchone` method to
+retrieve a single matching row, or call :meth:`~Cursor.fetchall` to get a list of the
 matching rows.
 
 This example uses the iterator form::
@@ -128,7 +128,7 @@ Module functions and constants
    returns.  It will look for a string formed [mytype] in there, and then decide
    that 'mytype' is the type of the column. It will try to find an entry of
    'mytype' in the converters dictionary and then use the converter function found
-   there to return the value. The column name found in :attr:`cursor.description`
+   there to return the value. The column name found in :attr:`Cursor.description`
    is only the first word of the column name, i.  e. if you use something like
    ``'as "x [datetime]"'`` in your SQL, then we will parse out everything until the
    first blank for the column name: the column name would simply be "x".
@@ -215,11 +215,13 @@ Module functions and constants
 Connection Objects
 ------------------
 
-A :class:`Connection` instance has the following attributes and methods:
+.. class:: Connection
+
+   A SQLite database connection has the following attributes and methods:
 
 .. attribute:: Connection.isolation_level
 
-   Get or set the current isolation level. None for autocommit mode or one of
+   Get or set the current isolation level. :const:`None` for autocommit mode or one of
    "DEFERRED", "IMMEDIATE" or "EXLUSIVE". See section
    :ref:`sqlite3-controlling-transactions` for a more detailed explanation.
 
@@ -234,7 +236,7 @@ A :class:`Connection` instance has the following attributes and methods:
 .. method:: Connection.commit()
 
    This method commits the current transaction. If you don't call this method,
-   anything you did since the last call to commit() is not visible from from
+   anything you did since the last call to ``commit()`` is not visible from from
    other database connections. If you wonder why you don't see the data you've
    written to the database, please check you didn't forget to call this method.
 
@@ -383,9 +385,9 @@ A :class:`Connection` instance has the following attributes and methods:
 
 .. attribute:: Connection.text_factory
 
-   Using this attribute you can control what objects are returned for the TEXT data
-   type. By default, this attribute is set to :class:`str` and the
-   :mod:`sqlite3` module will return strings for TEXT. If you want to
+   Using this attribute you can control what objects are returned for the ``TEXT``
+   data type. By default, this attribute is set to :class:`str` and the
+   :mod:`sqlite3` module will return Unicode objects for ``TEXT``. If you want to
    return bytestrings instead, you can set it to :class:`bytes`.
 
    For efficiency reasons, there's also a way to return :class:`str` objects
@@ -430,8 +432,9 @@ A :class:`Connection` instance has the following attributes and methods:
 Cursor Objects
 --------------
 
-A :class:`Cursor` instance has the following attributes and methods:
+.. class:: Cursor
 
+   A SQLite database cursor has the following attributes and methods:
 
 .. method:: Cursor.execute(sql, [parameters])
 
@@ -470,7 +473,7 @@ A :class:`Cursor` instance has the following attributes and methods:
 .. method:: Cursor.executescript(sql_script)
 
    This is a nonstandard convenience method for executing multiple SQL statements
-   at once. It issues a COMMIT statement first, then executes the SQL script it
+   at once. It issues a ``COMMIT`` statement first, then executes the SQL script it
    gets as a parameter.
 
    *sql_script* can be an instance of :class:`str` or :class:`bytes`.
@@ -483,7 +486,7 @@ A :class:`Cursor` instance has the following attributes and methods:
 .. method:: Cursor.fetchone()
 
    Fetches the next row of a query result set, returning a single sequence,
-   or ``None`` when no more data is available.
+   or :const:`None` when no more data is available.
 
 
 .. method:: Cursor.fetchmany([size=cursor.arraysize])
@@ -522,8 +525,8 @@ A :class:`Cursor` instance has the following attributes and methods:
    into :attr:`rowcount`.
 
    As required by the Python DB API Spec, the :attr:`rowcount` attribute "is -1 in
-   case no executeXX() has been performed on the cursor or the rowcount of the last
-   operation is not determinable by the interface".
+   case no ``executeXX()`` has been performed on the cursor or the rowcount of the
+   last operation is not determinable by the interface".
 
    This includes ``SELECT`` statements because we cannot determine the number of
    rows a query produced until all rows were fetched.
@@ -535,6 +538,81 @@ A :class:`Cursor` instance has the following attributes and methods:
    method. For operations other than ``INSERT`` or when :meth:`executemany` is
    called, :attr:`lastrowid` is set to :const:`None`.
 
+.. attribute:: Cursor.description
+
+   This read-only attribute provides the column names of the last query. To
+   remain compatible with the Python DB API, it returns a 7-tuple for each
+   column where the last six items of each tuple are :const:`None`. 
+   
+   It is set for ``SELECT`` statements without any matching rows as well.
+
+.. _sqlite3-row-objects:
+
+Row Objects
+-----------
+
+.. class:: Row
+
+   A :class:`Row` instance serves as a highly optimized
+   :attr:`~Connection.row_factory` for :class:`Connection` objects. 
+   It tries to mimic a tuple in most of its features.
+
+   It supports mapping access by column name and index, iteration,
+   representation, equality testing and :func:`len`.
+
+   If two :class:`Row` objects have exactly the same columns and their
+   members are equal, they compare equal.
+   
+   .. versionchanged:: 2.6
+      Added iteration and equality (hashability).
+
+   .. method:: keys
+
+      This method returns a tuple of column names. Immediately after a query,
+      it is the first member of each tuple in :attr:`Cursor.description`.
+
+      .. versionadded:: 2.6
+
+Let's assume we initialize a table as in the example given above::
+
+    conn = sqlite3.connect(":memory:")
+    c = conn.cursor()
+    c.execute('''create table stocks
+    (date text, trans text, symbol text,
+     qty real, price real)''')
+    c.execute("""insert into stocks
+              values ('2006-01-05','BUY','RHAT',100,35.14)""")
+    conn.commit()
+    c.close()
+
+Now we plug :class:`Row` in::
+
+    >>> conn.row_factory = sqlite3.Row
+    >>> c = conn.cursor()
+    >>> c.execute('select * from stocks')
+    <sqlite3.Cursor object at 0x7f4e7dd8fa80>
+    >>> r = c.fetchone()
+    >>> type(r)
+    <type 'sqlite3.Row'>
+    >>> r
+    (u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.140000000000001)
+    >>> len(r)
+    5
+    >>> r[2]
+    u'RHAT'
+    >>> r.keys()
+    ['date', 'trans', 'symbol', 'qty', 'price']
+    >>> r['qty']
+    100.0
+    >>> for member in r: print member
+    ...
+    2006-01-05
+    BUY
+    RHAT
+    100.0
+    35.14
+
+
 .. _sqlite3-types:
 
 SQLite and Python types
@@ -544,36 +622,38 @@ SQLite and Python types
 Introduction
 ^^^^^^^^^^^^
 
-SQLite natively supports the following types: NULL, INTEGER, REAL, TEXT, BLOB.
+SQLite natively supports the following types: ``NULL``, ``INTEGER``,
+``REAL``, ``TEXT``, ``BLOB``.
 
 The following Python types can thus be sent to SQLite without any problem:
 
 +-------------------------------+-------------+
 | Python type                   | SQLite type |
 +===============================+=============+
-| ``None``                      | NULL        |
+| :const:`None`                 | ``NULL``    |
 +-------------------------------+-------------+
-| :class:`int`                  | INTEGER     |
+| :class:`int`                  | ``INTEGER`` |
 +-------------------------------+-------------+
-| :class:`float`                | REAL        |
+| :class:`float`                | ``REAL``    |
 +-------------------------------+-------------+
-| :class:`bytes` (UTF8-encoded) | TEXT        |
+| :class:`bytes` (UTF8-encoded) | ``TEXT``    |
 +-------------------------------+-------------+
-| :class:`str`                  | TEXT        |
+| :class:`str`                  | ``TEXT``    |
 +-------------------------------+-------------+
-| :class:`buffer`               | BLOB        |
+| :class:`buffer`               | ``BLOB``    |
 +-------------------------------+-------------+
 
+
 This is how SQLite types are converted to Python types by default:
 
 +-------------+---------------------------------------------+
 | SQLite type | Python type                                 |
 +=============+=============================================+
-| ``NULL``    | None                                        |
+| ``NULL``    | :const:`None`                               |
 +-------------+---------------------------------------------+
-| ``INTEGER`` | int                                         |
+| ``INTEGER`` | :class`int`                                 |
 +-------------+---------------------------------------------+
-| ``REAL``    | float                                       |
+| ``REAL``    | :class:`float`                              |
 +-------------+---------------------------------------------+
 | ``TEXT``    | depends on text_factory, str by default     |
 +-------------+---------------------------------------------+
@@ -701,9 +781,10 @@ Controlling Transactions
 ------------------------
 
 By default, the :mod:`sqlite3` module opens transactions implicitly before a
-Data Modification Language (DML)  statement (i.e. INSERT/UPDATE/DELETE/REPLACE),
-and commits transactions implicitly before a non-DML, non-query statement (i. e.
-anything other than SELECT/INSERT/UPDATE/DELETE/REPLACE).
+Data Modification Language (DML)  statement (i.e. 
+``INSERT``/``UPDATE``/``DELETE``/``REPLACE``), and commits transactions
+implicitly before a non-DML, non-query statement (i. e.
+anything other than ``SELECT`` or the aforementioned).
 
 So if you are within a transaction and issue a command like ``CREATE TABLE
 ...``, ``VACUUM``, ``PRAGMA``, the :mod:`sqlite3` module will commit implicitly
@@ -712,7 +793,7 @@ is that some of these commands don't work within transactions. The other reason
 is that pysqlite needs to keep track of the transaction state (if a transaction
 is active or not).
 
-You can control which kind of "BEGIN" statements pysqlite implicitly executes
+You can control which kind of ``BEGIN`` statements pysqlite implicitly executes
 (or none at all) via the *isolation_level* parameter to the :func:`connect`
 call, or via the :attr:`isolation_level` property of connections.
 
@@ -736,7 +817,7 @@ Using the nonstandard :meth:`execute`, :meth:`executemany` and
 be written more concisely because you don't have to create the (often
 superfluous) :class:`Cursor` objects explicitly. Instead, the :class:`Cursor`
 objects are created implicitly and these shortcut methods return the cursor
-objects. This way, you can execute a SELECT statement and iterate over it
+objects. This way, you can execute a ``SELECT`` statement and iterate over it
 directly using only a single call on the :class:`Connection` object.
 
 .. literalinclude:: ../includes/sqlite3/shortcut_methods.py
index 56edd1ef5eb12b2e70a55883457d0aa08ac92242..68f8bfcbc18171960fe86a40371469add69b32c6 100644 (file)
@@ -334,8 +334,8 @@ Replacing /bin/sh shell backquote
    output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
 
 
-Replacing shell pipe line
-^^^^^^^^^^^^^^^^^^^^^^^^^
+Replacing shell pipeline
+^^^^^^^^^^^^^^^^^^^^^^^^
 
 ::
 
index 9cf0bea33b9e61b428e47f4de4e426388fb6e545..a799301f0da25f87ae505432c729b74c39000325 100644 (file)
@@ -775,9 +775,9 @@ can appear before a future statement are:
 .. XXX change this if future is cleaned out
 
 The features recognized by Python 3.0 are ``absolute_import``, ``division``,
-``generators``, ``nested_scopes`` and ``with_statement``.  They are all
-redundant because they are always enabled, and only kept for backwards
-compatibility.
+``generators``, ``unicode_literals``, ``print_function``, ``nested_scopes`` and
+``with_statement``.  They are all redundant because they are always enabled, and
+only kept for backwards compatibility.
 
 A future statement is recognized and treated specially at compile time: Changes
 to the semantics of core constructs are often implemented by generating
index 1f51399bacf373d94f4f223b72429adf4e6efd9b..59aea630389e6b13c93e1779b5816c0bd1f98730 100644 (file)
@@ -31,8 +31,8 @@ in the table are the size of the download files in Kilobytes.</p>
     <td><a href="{{ dlbase }}/python-docs-html.tar.bz2">Download</a> (ca. 4 MB)</td>
   </tr>
   <tr><td>Plain Text</td>
-    <td><a href="{{ dlbase }}/python-docs-pdf-text.zip">Download</a> (ca. 2 MB)</td>
-    <td><a href="{{ dlbase }}/python-docs-pdf-text.tar.bz2">Download</a> (ca. 1.5 MB)</td>
+    <td><a href="{{ dlbase }}/python-docs-text.zip">Download</a> (ca. 2 MB)</td>
+    <td><a href="{{ dlbase }}/python-docs-text.tar.bz2">Download</a> (ca. 1.5 MB)</td>
   </tr>
 </table>
 
index c10da385a0ae26bc30e70479b02434bd31bef32f..9b7dd032463dfa2f35505d1e3ddec4bd462547ea 100644 (file)
@@ -4,7 +4,7 @@
   <table class="contentstable" align="center"><tr>
     <td width="50%">
       <p class="biglink"><a class="biglink" href="{{ pathto("whatsnew/" + version) }}">What's new in Python {{ version }}?</a><br/>
-         <span class="linkdescr">changes since previous major release</span></p>
+         <span class="linkdescr">or <a href="{{ pathto("whatsnew/index") }}">all "What's new" documents</a> since 2.0</span></span></p>
       <p class="biglink"><a class="biglink" href="{{ pathto("tutorial/index") }}">Tutorial</a><br/>
          <span class="linkdescr">start here</span></p>
       <p class="biglink"><a class="biglink" href="{{ pathto("using/index") }}">Using Python</a><br/>
index 689cbdace076c91430d5caf375478db073d266d6..a6afd1506e5c29bb63cce90e0510ae6af3c7adb3 100644 (file)
@@ -1,5 +1,4 @@
 {% extends "!layout.html" %}
 {% block rootrellink %}
-<li><img src="{{ pathto('_static/py.png', 1) }}" alt="" style="vertical-align: middle; margin-top: -1px"/></li>
-{{ super() }}
+<li><img src="{{ pathto('_static/py.png', 1) }}" alt="" style="vertical-align: middle; margin-top: -1px"/></li><li><a href="{{ pathto('index') }}">{{ shorttitle }}</a>{{ reldelim1 }}</li>
 {% endblock %}
index 4cf1438c81a98de95577629767e0fc396a35725f..138329830a210f6bc7883c1df78bb2b9ff3177fa 100644 (file)
@@ -714,7 +714,7 @@ Python's division operator, ``/``, behaves like C's division operator when
 presented with two integer arguments: it returns an integer result that's
 truncated down when there would be a fractional part.  For example, ``3/2`` is
 1, not 1.5, and ``(-1)/2`` is -1, not -0.5.  This means that the results of
-divison can vary unexpectedly depending on the type of the two operands and
+division can vary unexpectedly depending on the type of the two operands and
 because Python is dynamically typed, it can be difficult to determine the
 possible types of the operands.
 
index f5c53c04a6a956637fcdfc3131b284d4713144f3..810aa25ace74f0b44ad0cc5ac2ed4da2c8d1a5a9 100644 (file)
@@ -1196,7 +1196,7 @@ Optimizations
 
 * The ``SET_LINENO`` opcode is now gone.  This may provide a small speed
   increase, depending on your compiler's idiosyncrasies. See section
-  :ref:`section-other` for a longer explanation. (Removed by Michael Hudson.)
+  :ref:`23section-other` for a longer explanation. (Removed by Michael Hudson.)
 
 * :func:`xrange` objects now have their own iterator, making ``for i in
   xrange(n)`` slightly faster than ``for i in range(n)``.  (Patch by Raymond
@@ -1951,7 +1951,7 @@ Other new platforms now supported by Python include AtheOS
 .. ======================================================================
 
 
-.. _section-other:
+.. _23section-other:
 
 Other Changes and Fixes
 =======================
@@ -2062,7 +2062,7 @@ code:
 .. ======================================================================
 
 
-.. _acks:
+.. _23acks:
 
 Acknowledgements
 ================
index bf30ac1eb3a72529bc2a73117a1b573585278f18..59788baba44e458a2993b7832b32e9ce28368aa4 100644 (file)
@@ -1551,7 +1551,7 @@ code:
 .. ======================================================================
 
 
-.. _acks:
+.. _24acks:
 
 Acknowledgements
 ================
index 925fd0fd3101be8643dd25092c6ebe0e53d2d35d..43ba6e5a6351fbdbedda486acd128d8f6cfca2b5 100644 (file)
@@ -16,9 +16,9 @@ release schedule.
 The changes in Python 2.5 are an interesting mix of language and library
 improvements. The library enhancements will be more important to Python's user
 community, I think, because several widely-useful packages were added.  New
-modules include ElementTree for XML processing (section :ref:`module-etree`),
-the SQLite database module (section :ref:`module-sqlite`), and the :mod:`ctypes`
-module for calling C functions (section :ref:`module-ctypes`).
+modules include ElementTree for XML processing (:mod:`xml.etree`),
+the SQLite database module (:mod:`sqlite`), and the :mod:`ctypes`
+module for calling C functions.
 
 The language changes are of middling significance.  Some pleasant new features
 were added, but most of them aren't features that you'll use every day.
@@ -736,7 +736,7 @@ add a :keyword:`return` statement at the marked location. ::
                # return False
 
 
-.. _module-contextlib:
+.. _contextlibmod:
 
 The contextlib module
 ---------------------
@@ -1109,7 +1109,7 @@ Here are all of the changes that Python 2.5 makes to the core Python language.
 .. ======================================================================
 
 
-.. _interactive:
+.. _25interactive:
 
 Interactive Interpreter Changes
 -------------------------------
@@ -1211,7 +1211,7 @@ marked in the following list.
 .. ======================================================================
 
 
-.. _modules:
+.. _25modules:
 
 New, Improved, and Removed Modules
 ==================================
@@ -1273,7 +1273,7 @@ complete list of changes, or look through the SVN logs for all the details.
   (Contributed by Raymond Hettinger.)
 
 * New module: The :mod:`contextlib` module contains helper functions for use
-  with the new ':keyword:`with`' statement.  See section :ref:`module-contextlib`
+  with the new ':keyword:`with`' statement.  See section :ref:`contextlibmod`
   for more about this module.
 
 * New module: The :mod:`cProfile` module is a C implementation of  the existing
@@ -2272,8 +2272,6 @@ code:
 .. ======================================================================
 
 
-.. _acks:
-
 Acknowledgements
 ================
 
index 7e4d68ab7cc3e91665cae4d566dcf66cce79ebdd..872d659a779e4fd4037a484fb95714009de6fa2c 100644 (file)
@@ -8,7 +8,7 @@
 :Release: |release|
 :Date: |today|
 
-.. $Id: whatsnew26.tex 55746 2007-06-02 18:33:53Z neal.norwitz $
+.. $Id$
    Rules for maintenance:
 
    * Anyone can add text to this document.  Do not spend very much time
@@ -49,9 +49,8 @@
    This saves the maintainer some effort going through the SVN logs
    when researching a change.
 
-This article explains the new features in Python 2.6.  The release
-schedule is described in :pep:`361`; currently the final release is
-scheduled for October 1 2008.
+This article explains the new features in Python 2.6, released on October 1
+2008.  The release schedule is described in :pep:`361`.
 
 The major theme of Python 2.6 is preparing the migration path to
 Python 3.0, a major redesign of the language.  Whenever possible,
@@ -663,33 +662,33 @@ and :meth:`Semaphore` to create shared locks.)
     from multiprocessing import Pool, Manager
 
     def factorial(N, dictionary):
-       "Compute a factorial."
-       # Calculate the result
-       fact = 1L
-       for i in range(1, N+1):
-           fact = fact * i
+        "Compute a factorial."
+        # Calculate the result
+        fact = 1L
+        for i in range(1, N+1):
+            fact = fact * i
 
         # Store result in dictionary
-       dictionary[N] = fact
+        dictionary[N] = fact
 
     if __name__ == '__main__':
-       p = Pool(5)
-       mgr = Manager()
-       d = mgr.dict()         # Create shared dictionary
+        p = Pool(5)
+        mgr = Manager()
+        d = mgr.dict()         # Create shared dictionary
 
-       # Run tasks using the pool
-       for N in range(1, 1000, 10):
-           p.apply_async(factorial, (N, d))
+        # Run tasks using the pool
+        for N in range(1, 1000, 10):
+            p.apply_async(factorial, (N, d))
 
-       # Mark pool as closed -- no more tasks can be added.
-       p.close()
+    # Mark pool as closed -- no more tasks can be added.
+    p.close()
 
-       # Wait for tasks to exit
-       p.join()
+    # Wait for tasks to exit
+    p.join()
 
-       # Output results
-       for k, v in sorted(d.items()):
-           print k, v
+    # Output results
+    for k, v in sorted(d.items()):
+        print k, v
 
 This will produce the output::
 
@@ -724,32 +723,33 @@ In 2.6, both 8-bit and Unicode strings have a `.format()` method that
 treats the string as a template and takes the arguments to be formatted.
 The formatting template uses curly brackets (`{`, `}`) as special characters::
 
-     # Substitute positional argument 0 into the string.
-     "User ID: {0}".format("root") -> "User ID: root"
-
-     # Use the named keyword arguments
-     'User ID: {uid}   Last seen: {last_login}'.format(
-            uid='root',
-            last_login = '5 Mar 2008 07:20') ->
-       'User ID: root   Last seen: 5 Mar 2008 07:20'
+     >>> # Substitute positional argument 0 into the string.
+     >>> "User ID: {0}".format("root")
+     'User ID: root'
+     >>> # Use the named keyword arguments
+     >>> "User ID: {uid}   Last seen: {last_login}".format(
+     ...    uid="root",
+     ...    last_login = "5 Mar 2008 07:20")
+     'User ID: root   Last seen: 5 Mar 2008 07:20'
 
 Curly brackets can be escaped by doubling them::
 
-     format("Empty dict: {{}}") -> "Empty dict: {}"
+     >>> format("Empty dict: {{}}")
+     "Empty dict: {}"
 
 Field names can be integers indicating positional arguments, such as
 ``{0}``, ``{1}``, etc. or names of keyword arguments.  You can also
 supply compound field names that read attributes or access dictionary keys::
 
-    import sys
-    'Platform: {0.platform}\nPython version: {0.version}'.format(sys) ->
-        'Platform: darwin\n
-         Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41) \n
-         [GCC 4.0.1 (Apple Computer, Inc. build 5367)]'
+    >>> import sys
+    >>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
+    Platform: darwin
+    Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41) 
+    [GCC 4.0.1 (Apple Computer, Inc. build 5367)]'
 
-    import mimetypes
-    'Content-type: {0[.mp4]}'.format(mimetypes.types_map) ->
-        'Content-type: video/mp4'
+    >>> import mimetypes
+    >>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)
+    'Content-type: video/mp4'
 
 Note that when using dictionary-style notation such as ``[.mp4]``, you
 don't need to put any quotation marks around the string; it will look
@@ -761,30 +761,25 @@ So far we've shown how to specify which field to substitute into the
 resulting string.  The precise formatting used is also controllable by
 adding a colon followed by a format specifier.  For example::
 
-     # Field 0: left justify, pad to 15 characters
-     # Field 1: right justify, pad to 6 characters
-     fmt = '{0:15} ${1:>6}'
-
-     fmt.format('Registration', 35) ->
-       'Registration    $    35'
-
-     fmt.format('Tutorial', 50) ->
-       'Tutorial        $    50'
-
-     fmt.format('Banquet', 125) ->
-       'Banquet         $   125'
+     >>> # Field 0: left justify, pad to 15 characters
+     >>> # Field 1: right justify, pad to 6 characters
+     >>> fmt = '{0:15} ${1:>6}'
+     >>> fmt.format('Registration', 35)
+     'Registration    $    35'
+     >>> fmt.format('Tutorial', 50)
+     'Tutorial        $    50'
+     >>> fmt.format('Banquet', 125)
+     'Banquet         $   125'
 
 Format specifiers can reference other fields through nesting::
 
-    fmt = '{0:{1}}'
-
-    width = 15
-    fmt.format('Invoice #1234', width) ->
-      'Invoice #1234  '
-
-    width = 35
-    fmt.format('Invoice #1234', width) ->
-      'Invoice #1234                      '
+    >>> fmt = '{0:{1}}'
+    >>> width = 15
+    >>> fmt.format('Invoice #1234', width)
+    'Invoice #1234  '
+    >>> width = 35
+    >>> fmt.format('Invoice #1234', width)
+    'Invoice #1234                      '
 
 The alignment of a field within the desired width can be specified:
 
@@ -799,7 +794,7 @@ Character        Effect
 
 Format specifiers can also include a presentation type, which
 controls how the value is formatted.  For example, floating-point numbers
-can be formatted as a general number or in exponential notation:
+can be formatted as a general number or in exponential notation::
 
     >>> '{0:g}'.format(3.75)
     '3.75'
@@ -807,25 +802,27 @@ can be formatted as a general number or in exponential notation:
     '3.750000e+00'
 
 A variety of presentation types are available.  Consult the 2.6
-documentation for a :ref:`complete list <formatstrings>`; here's a sample::
-
-        'b' - Binary. Outputs the number in base 2.
-        'c' - Character. Converts the integer to the corresponding
-              Unicode character before printing.
-        'd' - Decimal Integer. Outputs the number in base 10.
-        'o' - Octal format. Outputs the number in base 8.
-        'x' - Hex format. Outputs the number in base 16, using lower-
-              case letters for the digits above 9.
-        'e' - Exponent notation. Prints the number in scientific
-              notation using the letter 'e' to indicate the exponent.
-        'g' - General format. This prints the number as a fixed-point
-              number, unless the number is too large, in which case
-              it switches to 'e' exponent notation.
-        'n' - Number. This is the same as 'g' (for floats) or 'd' (for
-              integers), except that it uses the current locale setting to
-              insert the appropriate number separator characters.
-        '%' - Percentage. Multiplies the number by 100 and displays
-              in fixed ('f') format, followed by a percent sign.
+documentation for a :ref:`complete list <formatstrings>`; here's a sample:
+
+===== ========================================================================
+``b`` Binary. Outputs the number in base 2.
+``c`` Character. Converts the integer to the corresponding Unicode character
+      before printing.
+``d`` Decimal Integer. Outputs the number in base 10.
+``o`` Octal format. Outputs the number in base 8.
+``x`` Hex format. Outputs the number in base 16, using lower-case letters for
+      the digits above 9.
+``e`` Exponent notation. Prints the number in scientific notation using the
+      letter 'e' to indicate the exponent.
+``g`` General format. This prints the number as a fixed-point number, unless
+      the number is too large, in which case it switches to 'e' exponent
+      notation.
+``n`` Number. This is the same as 'g' (for floats) or 'd' (for integers),
+      except that it uses the current locale setting to insert the appropriate
+      number separator characters.
+``%`` Percentage. Multiplies the number by 100 and displays in fixed ('f')
+      format, followed by a percent sign.
+===== ========================================================================
 
 Classes and types can define a :meth:`__format__` method to control how they're
 formatted.  It receives a single argument, the format specifier::
@@ -866,13 +863,14 @@ by doing ``def print(...)`` or importing a new function from somewhere else.
 Python 2.6 has a ``__future__`` import that removes ``print`` as language
 syntax, letting you use the functional form instead.  For example::
 
-    from __future__ import print_function
-    print('# of entries', len(dictionary), file=sys.stderr)
+    >>> from __future__ import print_function
+    >>> print('# of entries', len(dictionary), file=sys.stderr)
 
 The signature of the new function is::
 
     def print(*args, sep=' ', end='\n', file=None)
 
+
 The parameters are:
 
  * *args*: positional arguments whose values will be printed out.
@@ -950,6 +948,20 @@ or using a :class:`bytes` constructor.  For future compatibility,
 Python 2.6 adds :class:`bytes` as a synonym for the :class:`str` type,
 and it also supports the ``b''`` notation.
 
+
+The 2.6 :class:`str` differs from 3.0's :class:`bytes` type in various
+ways; most notably, the constructor is completely different.  In 3.0,
+``bytes([65, 66, 67])`` is 3 elements long, containing the bytes
+representing ``ABC``; in 2.6, ``bytes([65, 66, 67])`` returns the
+12-byte string representing the :func:`str` of the list.
+
+The primary use of :class:`bytes` in 2.6 will be to write tests of
+object type such as ``isinstance(x, bytes)``.  This will help the 2to3
+converter, which can't tell whether 2.x code intends strings to
+contain either characters or 8-bit bytes; you can now 
+use either :class:`bytes` or :class:`str` to represent your intention 
+exactly, and the resulting code will also be correct in Python 3.0.
+
 There's also a ``__future__`` import that causes all string literals
 to become Unicode strings.  This means that ``\u`` escape sequences
 can be used to include Unicode characters::
@@ -989,6 +1001,8 @@ Byte arrays support most of the methods of string types, such as
 and some of the methods of lists, such as :meth:`append`,
 :meth:`pop`,  and :meth:`reverse`.
 
+::
+
     >>> b = bytearray('ABC')
     >>> b.append('d')
     >>> b.append(ord('e'))
@@ -1211,8 +1225,8 @@ To check whether an object supports a particular interface, you can
 now write::
 
     def func(d):
-       if not isinstance(d, collections.MutableMapping):
-           raise ValueError("Mapping object expected, not %r" % d)
+        if not isinstance(d, collections.MutableMapping):
+            raise ValueError("Mapping object expected, not %r" % d)
 
 Don't feel that you must now begin writing lots of checks as in the
 above example.  Python has a strong tradition of duck-typing, where
@@ -1224,22 +1238,22 @@ do it where it's absolutely necessary.
 You can write your own ABCs by using ``abc.ABCMeta`` as the
 metaclass in a class definition::
 
-  from abc import ABCMeta, abstractmethod
+    from abc import ABCMeta, abstractmethod
 
-  class Drawable():
-      __metaclass__ = ABCMeta
+    class Drawable():
+        __metaclass__ = ABCMeta
 
-      @abstractmethod
-      def draw(self, x, y, scale=1.0):
-         pass
+        @abstractmethod
+        def draw(self, x, y, scale=1.0):
+            pass
 
-      def draw_doubled(self, x, y):
-         self.draw(x, y, scale=2.0)
+        def draw_doubled(self, x, y):
+            self.draw(x, y, scale=2.0)
 
 
-  class Square(Drawable):
-      def draw(self, x, y, scale):
-          ...
+    class Square(Drawable):
+        def draw(self, x, y, scale):
+            ...
 
 
 In the :class:`Drawable` ABC above, the :meth:`draw_doubled` method
@@ -1259,7 +1273,7 @@ try to create an instance of a subclass lacking the method::
     >>> class Circle(Drawable):
     ...     pass
     ...
-    >>> c=Circle()
+    >>> c = Circle()
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     TypeError: Can't instantiate abstract class Circle with abstract methods draw
@@ -1318,7 +1332,7 @@ built-in returns the binary representation for a number::
 The :func:`int` and :func:`long` built-ins will now accept the "0o"
 and "0b" prefixes when base-8 or base-2 are requested, or when the
 *base* argument is zero (signalling that the base used should be
-determined from the string):
+determined from the string)::
 
     >>> int ('0o52', 0)
     42
@@ -1491,7 +1505,7 @@ Some smaller changes made to the core Python language are:
   (Contributed by Alexander Belopolsky; :issue:`1686487`.)
 
   It's also become legal to provide keyword arguments after a ``*args`` argument
-  to a function call.
+  to a function call. ::
 
     >>> def f(*args, **kw):
     ...     print args, kw
@@ -1532,17 +1546,17 @@ Some smaller changes made to the core Python language are:
   property. You would use them like this::
 
     class C(object):
-       @property
-       def x(self):
-           return self._x
+        @property
+        def x(self):
+            return self._x
 
-       @x.setter
-       def x(self, value):
-           self._x = value
+        @x.setter
+        def x(self, value):
+            self._x = value
 
-       @x.deleter
-       def x(self):
-           del self._x
+        @x.deleter
+        def x(self):
+            del self._x
 
     class D(C):
         @C.x.getter
@@ -1865,8 +1879,8 @@ changes, or look through the Subversion logs for all the details.
 
      >>> var_type = collections.namedtuple('variable',
      ...             'id name type size')
-     # Names are separated by spaces or commas.
-     # 'id, name, type, size' would also work.
+     >>> # Names are separated by spaces or commas.
+     >>> # 'id, name, type, size' would also work.
      >>> var_type._fields
      ('id', 'name', 'type', 'size')
 
@@ -1916,11 +1930,13 @@ changes, or look through the Subversion logs for all the details.
 
 * A new window method in the :mod:`curses` module,
   :meth:`chgat`, changes the display attributes for a certain number of
-  characters on a single line.  (Contributed by Fabian Kreutz.)  ::
+  characters on a single line.  (Contributed by Fabian Kreutz.)
+  
+  ::
 
      # Boldface text starting at y=0,x=21
      # and affecting the rest of the line.
-     stdscr.chgat(0,21, curses.A_BOLD)
+     stdscr.chgat(0, 21, curses.A_BOLD)
 
   The :class:`Textbox` class in the :mod:`curses.textpad` module
   now supports editing in insert mode as well as overwrite mode.
@@ -1986,8 +2002,8 @@ changes, or look through the Subversion logs for all the details.
   order, and returns a new generator that returns the contents of all
   the iterators, also in sorted order.  For example::
 
-     heapq.merge([1, 3, 5, 9], [2, 8, 16]) ->
-       [1, 2, 3, 5, 8, 9, 16]
+      >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))
+      [1, 2, 3, 5, 8, 9, 16]
 
   Another new function, ``heappushpop(heap, item)``,
   pushes *item* onto *heap*, then pops off and returns the smallest item.
@@ -2021,57 +2037,55 @@ changes, or look through the Subversion logs for all the details.
   each of the elements; if some of the iterables are shorter than
   others, the missing values are set to *fillvalue*.  For example::
 
-     itertools.izip_longest([1,2,3], [1,2,3,4,5]) ->
-       (1, 1), (2, 2), (3, 3), (None, 4), (None, 5)
+     >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))
+     ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))
 
   ``product(iter1, iter2, ..., [repeat=N])`` returns the Cartesian product
   of the supplied iterables, a set of tuples containing
   every possible combination of the elements returned from each iterable. ::
 
-     itertools.product([1,2,3], [4,5,6]) ->
-        (1, 4), (1, 5), (1, 6),
-       (2, 4), (2, 5), (2, 6),
-       (3, 4), (3, 5), (3, 6)
+     >>> list(itertools.product([1,2,3], [4,5,6]))
+     [(1, 4), (1, 5), (1, 6),
+         (2, 4), (2, 5), (2, 6),
+         (3, 4), (3, 5), (3, 6)]
 
   The optional *repeat* keyword argument is used for taking the
   product of an iterable or a set of iterables with themselves,
   repeated *N* times.  With a single iterable argument, *N*-tuples
   are returned::
 
-     itertools.product([1,2], repeat=3) ->
-        (1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
-        (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)
+     >>> list(itertools.product([1,2], repeat=3))
+     [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
+      (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
 
   With two iterables, *2N*-tuples are returned. ::
 
-     itertools.product([1,2], [3,4], repeat=2) ->
-        (1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
-        (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
-        (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
-        (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)
+     >>> list(itertools.product([1,2], [3,4], repeat=2))
+     [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
+      (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
+      (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
+      (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
 
   ``combinations(iterable, r)`` returns sub-sequences of length *r* from
   the elements of *iterable*. ::
 
-    itertools.combinations('123', 2) ->
-       ('1', '2'), ('1', '3'), ('2', '3')
-
-    itertools.combinations('123', 3) ->
-       ('1', '2', '3')
-
-    itertools.combinations('1234', 3) ->
-       ('1', '2', '3'), ('1', '2', '4'), ('1', '3', '4'),
-       ('2', '3', '4')
+    >>> list(itertools.combinations('123', 2))
+    [('1', '2'), ('1', '3'), ('2', '3')]
+    >>> list(itertools.combinations('123', 3))
+    [('1', '2', '3')]
+    >>> list(itertools.combinations('1234', 3))
+    [('1', '2', '3'), ('1', '2', '4'),
+     ('1', '3', '4'), ('2', '3', '4')]
 
   ``permutations(iter[, r])`` returns all the permutations of length *r* of
   the iterable's elements.  If *r* is not specified, it will default to the
   number of elements produced by the iterable. ::
 
-    itertools.permutations([1,2,3,4], 2) ->
-       (1, 2), (1, 3), (1, 4),
-       (2, 1), (2, 3), (2, 4),
-       (3, 1), (3, 2), (3, 4),
-       (4, 1), (4, 2), (4, 3)
+    >>> list(itertools.permutations([1,2,3,4], 2))
+    [(1, 2), (1, 3), (1, 4),
+     (2, 1), (2, 3), (2, 4),
+     (3, 1), (3, 2), (3, 4),
+     (4, 1), (4, 2), (4, 3)]
 
   ``itertools.chain(*iterables)`` is an existing function in
   :mod:`itertools` that gained a new constructor in Python 2.6.
@@ -2080,8 +2094,8 @@ changes, or look through the Subversion logs for all the details.
   then return all the elements of the first iterable, then
   all the elements of the second, and so on. ::
 
-    chain.from_iterable([[1,2,3], [4,5,6]]) ->
-        1, 2, 3, 4, 5, 6
+    >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))
+    [1, 2, 3, 4, 5, 6]
 
   (All contributed by Raymond Hettinger.)
 
@@ -2252,16 +2266,15 @@ changes, or look through the Subversion logs for all the details.
   with an installed Python package.  For example::
 
     >>> import pkgutil
-    >>> pkgutil.get_data('test', 'exception_hierarchy.txt')
-    'BaseException
+    >>> print pkgutil.get_data('test', 'exception_hierarchy.txt')
+    BaseException
      +-- SystemExit
      +-- KeyboardInterrupt
      +-- GeneratorExit
      +-- Exception
           +-- StopIteration
           +-- StandardError
-     ...'
-    >>>
+     ...
 
   (Contributed by Paul Moore; :issue:`2439`.)
 
@@ -2535,9 +2548,9 @@ changes, or look through the Subversion logs for all the details.
 
       with test_support.check_warnings() as wrec:
           warnings.simplefilter("always")
-          ... code that triggers a warning ...
+          ... code that triggers a warning ...
           assert str(wrec.message) == "function is outdated"
-         assert len(wrec.warnings) == 1, "Multiple warnings raised"
+          assert len(wrec.warnings) == 1, "Multiple warnings raised"
 
   (Contributed by Brett Cannon.)
 
@@ -2711,7 +2724,7 @@ for debugging::
     t = ast.parse("""
     d = {}
     for i in 'abcdefghijklm':
-       d[i + i] = ord(i) - ord('a') + 1
+        d[i + i] = ord(i) - ord('a') + 1
     print d
     """)
     print ast.dump(t)
@@ -2720,32 +2733,32 @@ This outputs a deeply nested tree::
 
     Module(body=[
       Assign(targets=[
-       Name(id='d', ctx=Store())
+        Name(id='d', ctx=Store())
        ], value=Dict(keys=[], values=[]))
       For(target=Name(id='i', ctx=Store()),
-         iter=Str(s='abcdefghijklm'), body=[
-       Assign(targets=[
-         Subscript(value=
-          Name(id='d', ctx=Load()),
-            slice=
-            Index(value=
-           BinOp(left=Name(id='i', ctx=Load()), op=Add(),
-            right=Name(id='i', ctx=Load()))), ctx=Store())
-        ], value=
-        BinOp(left=
-         BinOp(left=
-          Call(func=
-           Name(id='ord', ctx=Load()), args=[
-            Name(id='i', ctx=Load())
-           ], keywords=[], starargs=None, kwargs=None),
-          op=Sub(), right=Call(func=
-           Name(id='ord', ctx=Load()), args=[
-            Str(s='a')
-           ], keywords=[], starargs=None, kwargs=None)),
-          op=Add(), right=Num(n=1)))
-       ], orelse=[])
-      Print(dest=None, values=[
-       Name(id='d', ctx=Load())
+          iter=Str(s='abcdefghijklm'), body=[
+        Assign(targets=[
+          Subscript(value=
+            Name(id='d', ctx=Load()),
+              slice=
+              Index(value=
+                BinOp(left=Name(id='i', ctx=Load()), op=Add(),
+                 right=Name(id='i', ctx=Load()))), ctx=Store())
+         ], value=
+         BinOp(left=
+          BinOp(left=
+           Call(func=
+            Name(id='ord', ctx=Load()), args=[
+              Name(id='i', ctx=Load())
+             ], keywords=[], starargs=None, kwargs=None),
+           op=Sub(), right=Call(func=
+            Name(id='ord', ctx=Load()), args=[
+              Str(s='a')
+             ], keywords=[], starargs=None, kwargs=None)),
+           op=Add(), right=Num(n=1)))
+        ], orelse=[])
+       Print(dest=None, values=[
+         Name(id='d', ctx=Load())
        ], nl=True)
      ])
 
@@ -2754,7 +2767,7 @@ representing a literal expression, parses and evaluates it, and
 returns the resulting value.  A literal expression is a Python
 expression containing only strings, numbers, dictionaries,
 etc. but no statements or function calls.  If you need to
-evaluate an expression but accept the security risk of using an
+evaluate an expression but cannot accept the security risk of using an
 :func:`eval` call, :func:`literal_eval` will handle it safely::
 
     >>> literal = '("a", "b", {2:4, 3:8, 1:2})'
@@ -2849,8 +2862,8 @@ Using the module is simple::
 
     # Create data structure
     data_struct = dict(lastAccessed=datetime.datetime.now(),
-                      version=1,
-                      categories=('Personal','Shared','Private'))
+                       version=1,
+                       categories=('Personal','Shared','Private'))
 
     # Create string containing XML.
     plist_str = plistlib.writePlistToString(data_struct)
@@ -3040,7 +3053,7 @@ Changes to Python's build process and to the C API include:
   ``numfree``, and a macro ``Py<typename>_MAXFREELIST`` is
   always defined.
 
-* A new Makefile target, "make check", prepares the Python source tree
+* A new Makefile target, "make patchcheck", prepares the Python source tree
   for making a patch: it fixes trailing whitespace in all modified
   ``.py`` files, checks whether the documentation has been changed,
   and reports whether the :file:`Misc/ACKS` and :file:`Misc/NEWS` files
@@ -3261,13 +3274,13 @@ that may require changes to your code:
 .. ======================================================================
 
 
-.. _acks:
+.. _26acks:
 
 Acknowledgements
 ================
 
 The author would like to thank the following people for offering
 suggestions, corrections and assistance with various drafts of this
-article: Georg Brandl, Steve Brown, Nick Coghlan, Jim Jewett, Kent
-Johnson, Chris Lambacher, Antoine Pitrou.
+article: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, 
+Jim Jewett, Kent Johnson, Chris Lambacher, Antoine Pitrou, Brian Warner.
 
diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst
new file mode 100644 (file)
index 0000000..a9eb0ba
--- /dev/null
@@ -0,0 +1,138 @@
+****************************
+  What's New in Python 2.7
+****************************
+
+:Author: A.M. Kuchling (amk at amk.ca)
+:Release: |release|
+:Date: |today|
+
+.. $Id$
+   Rules for maintenance:
+
+   * Anyone can add text to this document.  Do not spend very much time
+   on the wording of your changes, because your text will probably
+   get rewritten to some degree.
+
+   * The maintainer will go through Misc/NEWS periodically and add
+   changes; it's therefore more important to add your changes to
+   Misc/NEWS than to this file.
+
+   * This is not a complete list of every single change; completeness
+   is the purpose of Misc/NEWS.  Some changes I consider too small
+   or esoteric to include.  If such a change is added to the text,
+   I'll just remove it.  (This is another reason you shouldn't spend
+   too much time on writing your addition.)
+
+   * If you want to draw your new text to the attention of the
+   maintainer, add 'XXX' to the beginning of the paragraph or
+   section.
+
+   * It's OK to just add a fragmentary note about a change.  For
+   example: "XXX Describe the transmogrify() function added to the
+   socket module."  The maintainer will research the change and
+   write the necessary text.
+
+   * You can comment out your additions if you like, but it's not
+   necessary (especially when a final release is some months away).
+
+   * Credit the author of a patch or bugfix.   Just the name is
+   sufficient; the e-mail address isn't necessary.
+
+   * It's helpful to add the bug/patch number in a parenthetical comment.
+
+   XXX Describe the transmogrify() function added to the socket
+   module.
+   (Contributed by P.Y. Developer; :issue:`12345`.)
+
+   This saves the maintainer some effort going through the SVN logs
+   when researching a change.
+
+This article explains the new features in Python 2.7.
+No release schedule has been decided yet for 2.7.
+
+.. Compare with previous release in 2 - 3 sentences here.
+   add hyperlink when the documentation becomes available online.
+
+.. ========================================================================
+.. Large, PEP-level features and changes should be described here.
+.. Should there be a new section here for 3k migration?
+.. Or perhaps a more general section describing module changes/deprecation?
+.. ========================================================================
+
+
+
+Other Language Changes
+======================
+
+Some smaller changes made to the core Python language are:
+
+* List of changes to be written here.
+
+.. ======================================================================
+
+
+Optimizations
+-------------
+
+To be written.
+
+.. ======================================================================
+
+New, Improved, and Deprecated Modules
+=====================================
+
+As in every release, Python's standard library received a number of
+enhancements and bug fixes.  Here's a partial list of the most notable
+changes, sorted alphabetically by module name. Consult the
+:file:`Misc/NEWS` file in the source tree for a more complete list of
+changes, or look through the Subversion logs for all the details.
+
+* To be written.
+
+.. ======================================================================
+.. whole new modules get described in subsections here
+
+.. ======================================================================
+
+
+Build and C API Changes
+=======================
+
+Changes to Python's build process and to the C API include:
+
+* To be written.
+
+.. ======================================================================
+
+Port-Specific Changes: Windows
+-----------------------------------
+
+
+.. ======================================================================
+
+Port-Specific Changes: Mac OS X
+-----------------------------------
+
+
+.. ======================================================================
+
+Porting to Python 2.7
+=====================
+
+This section lists previously described changes and other bugfixes
+that may require changes to your code:
+
+To be written.
+
+.. ======================================================================
+
+
+.. _acks27:
+
+Acknowledgements
+================
+
+The author would like to thank the following people for offering
+suggestions, corrections and assistance with various drafts of this
+article: no one yet.
+
index 0898d2229fac2029f640f7ef5993113391561103..11638b9fba08582d7bf8eb17aea6282cd0ae6416 100644 (file)
@@ -440,7 +440,7 @@ Platform-specific changes go here.
 .. ======================================================================
 
 
-.. _section-other:
+.. _30section-other:
 
 Other Changes and Fixes
 =======================
diff --git a/Doc/whatsnew/index.rst b/Doc/whatsnew/index.rst
new file mode 100644 (file)
index 0000000..61bc701
--- /dev/null
@@ -0,0 +1,22 @@
+.. _whatsnew-index:
+
+######################
+ What's New in Python
+######################
+
+The "What's New in Python" series of essays takes tours through the most
+important changes between major Python versions.  They are a "must read" for
+anyone wishing to stay up-to-date after a new release.
+
+.. toctree::
+   :maxdepth: 1
+
+   3.0.rst
+   2.7.rst
+   2.6.rst
+   2.5.rst
+   2.4.rst
+   2.3.rst
+   2.2.rst
+   2.1.rst
+   2.0.rst
index ab2ce40077e336fcc51648715f778fe046811059..3792e76c61c60521d4a1e0f08a737c74ca6ff3af 100644 (file)
@@ -1,21 +1,13 @@
-"""optparse - a powerful, extensible, and easy-to-use option parser.
+"""A powerful, extensible, and easy-to-use option parser.
 
 By Greg Ward <gward@python.net>
 
-Originally distributed as Optik; see http://optik.sourceforge.net/ .
-
-If you have problems with this module, please do not file bugs,
-patches, or feature requests with Python; instead, use Optik's
-SourceForge project page:
-  http://sourceforge.net/projects/optik
+Originally distributed as Optik.
 
 For support, use the optik-users@lists.sourceforge.net mailing list
 (http://lists.sourceforge.net/lists/listinfo/optik-users).
 """
 
-# Python developers: please do not make changes to this file, since
-# it is automatically generated from the Optik source code.
-
 __version__ = "1.5.3"
 
 __all__ = ['Option',
@@ -1263,9 +1255,19 @@ class OptionParser (OptionContainer):
             self.usage = usage
 
     def enable_interspersed_args(self):
+        """Set parsing to not stop on the first non-option, allowing
+        interspersing switches with command arguments. This is the
+        default behavior. See also disable_interspersed_args() and the
+        class documentation description of the attribute
+        allow_interspersed_args."""
         self.allow_interspersed_args = True
 
     def disable_interspersed_args(self):
+        """Set parsing to stop on the first non-option. Use this if
+        you have a command processor which runs another command that
+        has options of its own and you want to make sure these options
+        don't get confused.
+        """
         self.allow_interspersed_args = False
 
     def set_process_default_values(self, process):
index 04af9fb143d0312ea17cf7705915ef03a45b3822..8a71036fde077f5c2b59c48db39bb108665cb17d 100644 (file)
@@ -26,12 +26,13 @@ def raise2():
 class TestCase(unittest.TestCase):
     def setUp(self):
         self.stream = io.StringIO()
+        self.save_stdout, self.save_stderr = sys.stderr, sys.stdout
         sys.stdout = sys.stderr = self.stream
         atexit._clear()
 
     def tearDown(self):
-        sys.stdout = sys.__stdout__
-        sys.stderr = sys.__stderr__
+        sys.stdout = self.save_stdout
+        sys.stderr = self.save_stderr
         atexit._clear()
 
     def test_args(self):
index 987f33cb6135a930d0559c2caa20992dc4b7c22b..df2f8b1ddd61c8a173a9bababfa68f95ac3e0339 100644 (file)
@@ -196,6 +196,17 @@ class TestInsort(unittest.TestCase):
     def test_backcompatibility(self):
         self.assertEqual(self.module.insort, self.module.insort_right)
 
+    def test_listDerived(self):
+        class List(list):
+            data = []
+            def insert(self, index, item):
+                self.data.insert(index, item)
+
+        lst = List()
+        self.module.insort_left(lst, 10)
+        self.module.insort_right(lst, 5)
+        self.assertEqual([5, 10], lst.data)
+
 class TestInsortPython(TestInsort):
     module = py_bisect
 
index 4b8ae82df77fcd101872453862ff90a5ab522504..ead4b1ca17b036e347d5dbd910c6b20946b85b26 100644 (file)
@@ -249,7 +249,7 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
         self.assertRaises(TypeError, lambda: a // x)
         self.assertRaises(TypeError, lambda: x // a)
 
-        # Divison of int by timedelta doesn't make sense.
+        # Division of int by timedelta doesn't make sense.
         # Division by zero doesn't make sense.
         for zero in 0, 0:
             self.assertRaises(TypeError, lambda: zero // a)
index ee82dd2fa90ecdd48f5896ec0e056b6043167c60..9f929f4fec785ff741f3926f9e1cdbc8b8d0b142 100644 (file)
@@ -140,6 +140,23 @@ class WhichDBTestCase(unittest.TestCase):
 
     def setUp(self):
         delete_files()
+        self.filename = test.support.TESTFN
+        self.d = dbm.open(self.filename, 'c')
+        self.d.close()
+
+    def test_keys(self):
+        self.d = dbm.open(self.filename, 'c')
+        self.assertEqual(self.d.keys(), [])
+        a = [(b'a', b'b'), (b'12345678910', b'019237410982340912840198242')]
+        for k, v in a:
+            self.d[k] = v
+        self.assertEqual(sorted(self.d.keys()), sorted(k for (k, v) in a))
+        for k, v in a:
+            self.assert_(k in self.d)
+            self.assertEqual(self.d[k], v)
+        self.assert_('xxx' not in self.d)
+        self.assertRaises(KeyError, lambda: self.d['xxx'])
+        self.d.close()
 
 
 def test_main():
index d1799a23452058f9d8020a56d379fa0759d7360b..bd96e2378c3c13a35080983f09bce89d906c9ec6 100644 (file)
@@ -8,9 +8,9 @@ import unittest
 PORT = None
 
 def server(evt, numrequests):
-    try:
-        serv = DocXMLRPCServer(("localhost", 0), logRequests=False)
+    serv = DocXMLRPCServer(("localhost", 0), logRequests=False)
 
+    try:
         global PORT
         PORT = serv.socket.getsockname()[1]
 
index 0e9255149a21484a9bd15f01489a9dccd240e3f8..0effd65c83cc589a089225ce44a152f6bcf394a1 100644 (file)
@@ -391,6 +391,17 @@ class TestSet(TestJointOps):
             else:
                 self.fail()
 
+    def test_remove_keyerror_set(self):
+        key = self.thetype([3, 4])
+        try:
+            self.s.remove(key)
+        except KeyError as e:
+            self.assert_(e.args[0] is key,
+                         "KeyError should be {0}, not {1}".format(key,
+                                                                  e.args[0]))
+        else:
+            self.fail()
+
     def test_discard(self):
         self.s.discard('a')
         self.assert_('a' not in self.s)
index 61560728ccb11a6dbe1502f854375e4df17d17f7..0559b4519e651d06316fe4b9f93985b4eb504115 100755 (executable)
@@ -130,8 +130,8 @@ LIBRARY_RECIPES = [
     ),
 
     dict(
-        name="SQLite 3.3.5",
-        url="http://www.sqlite.org/sqlite-3.3.5.tar.gz",
+        name="SQLite 3.6.3",
+        url="http://www.sqlite.org/sqlite-3.6.3.tar.gz",
         checksum='93f742986e8bc2dfa34792e16df017a6feccf3a2',
         configure_pre=[
             '--enable-threadsafe',
@@ -171,8 +171,8 @@ LIBRARY_RECIPES = [
             ),
     ),
     dict(
-        name="Sleepycat DB 4.4",
-        url="http://downloads.sleepycat.com/db-4.4.20.tar.gz",
+        name="Sleepycat DB 4.7.25",
+        url="http://download.oracle.com/berkeley-db/db-4.7.25.tar.gz",
         #name="Sleepycat DB 4.3.29",
         #url="http://downloads.sleepycat.com/db-4.3.29.tar.gz",
         buildDir="build_unix",
@@ -586,21 +586,23 @@ def buildPythonDocs():
     version = getVersion()
     docdir = os.path.join(rootDir, 'pydocs')
 
+    novername = 'python-docs-html.tar.bz2'
     name = 'html-%s.tar.bz2'%(getFullVersion(),)
     sourceArchive = os.path.join(DEPSRC, name)
     if os.path.exists(sourceArchive):
         print("Using local copy of %s"%(name,))
 
     else:
-        print("Downloading %s"%(name,))
+        print "Downloading %s"%(novername,)
         downloadURL('http://www.python.org/ftp/python/doc/%s/%s'%(
-            getFullVersion(), name), sourceArchive)
+            getFullVersion(), novername), sourceArchive)
         print("Archive for %s stored as %s"%(name, sourceArchive))
 
     extractArchive(os.path.dirname(docdir), sourceArchive)
+
     os.rename(
             os.path.join(
-                os.path.dirname(docdir), 'Python-Docs-%s'%(getFullVersion(),)),
+                os.path.dirname(docdir), 'python-docs-html'),
             docdir)
 
 
@@ -1029,11 +1031,11 @@ def main():
     buildPython()
     buildPythonDocs()
     fn = os.path.join(WORKDIR, "_root", "Applications",
-                "MacPython %s"%(getVersion(),), "Update Shell Profile.command")
+                "Python %s"%(getVersion(),), "Update Shell Profile.command")
     patchFile("scripts/postflight.patch-profile",  fn)
     os.chmod(fn, 0755)
 
-    folder = os.path.join(WORKDIR, "_root", "Applications", "MacPython %s"%(
+    folder = os.path.join(WORKDIR, "_root", "Applications", "Python %s"%(
         getVersion(),))
     os.chmod(folder, 0755)
     setIcon(folder, "../Icons/Python Folder.icns")
index ec674e7a49ed10128ccda60b999f2b273c6839d9..2fcbdf7242d776dea5fb41aff0af65c9b8c00dac 100644 (file)
@@ -176,8 +176,8 @@ PYTHON=             python$(EXE)
 BUILDPYTHON=   python$(BUILDEXE)
 
 # The task to run while instrument when building the profile-opt target
-PROFILE_TASK=  Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
-#PROFILE_TASK= Lib/test/regrtest.py
+PROFILE_TASK=  $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
+#PROFILE_TASK= $(srcdir)/Lib/test/regrtest.py
 
 # === Definitions added by makesetup ===
 
index b84509be57e38d24b13e3d7a26b77f9d9d2712fc..fe2e1102ed729aa0288fa10949c1e6c969bad2e7 100644 (file)
@@ -82,7 +82,7 @@ insort_right(PyObject *self, PyObject *args, PyObject *kw)
        index = internal_bisect_right(list, item, lo, hi);
        if (index < 0)
                return NULL;
-       if (PyList_Check(list)) {
+       if (PyList_CheckExact(list)) {
                if (PyList_Insert(list, index, item) < 0)
                        return NULL;
        } else {
@@ -183,7 +183,7 @@ insort_left(PyObject *self, PyObject *args, PyObject *kw)
        index = internal_bisect_left(list, item, lo, hi);
        if (index < 0)
                return NULL;
-       if (PyList_Check(list)) {
+       if (PyList_CheckExact(list)) {
                if (PyList_Insert(list, index, item) < 0)
                        return NULL;
        } else {
index 5026c05897bd75f2c4a6e21636b41bb6d2619f92..fc3e3f9bbd66add4a115d409048f5c951a235719 100644 (file)
@@ -108,7 +108,7 @@ Decodes obj using the codec registered for encoding. encoding defaults\n\
 to the default encoding. errors may be given to set a different error\n\
 handling scheme. Default is 'strict' meaning that encoding errors raise\n\
 a ValueError. Other possible values are 'ignore' and 'replace'\n\
-as well as any other name registerd with codecs.register_error that is\n\
+as well as any other name registered with codecs.register_error that is\n\
 able to handle ValueErrors.");
 
 static PyObject *
index 67c25b164667e89a1c17a7513eec02c9fc168263..2732270903ac675d9ee5e308c94da599285b6f00 100644 (file)
@@ -36,7 +36,7 @@ PyDoc_STRVAR(MultibyteCodec_Decode__doc__,
 Decodes `string' using I, an MultibyteCodec instance. errors may be given\n\
 to set a different error handling scheme. Default is 'strict' meaning\n\
 that encoding errors raise a UnicodeDecodeError. Other possible values\n\
-are 'ignore' and 'replace' as well as any other name registerd with\n\
+are 'ignore' and 'replace' as well as any other name registered with\n\
 codecs.register_error that is able to handle UnicodeDecodeErrors.");
 
 static char *codeckwarglist[] = {"input", "errors", NULL};
index 12ee9a82fec23ece487f7a2c480a16fc639484ac..c725b7d2ddfc5866e7c9438e46d1eee874538972 100644 (file)
@@ -751,11 +751,16 @@ win32_wchdir(LPCWSTR path)
        if (!result)
                return FALSE;
        if (result > MAX_PATH+1) {
-               new_path = malloc(result);
+               new_path = malloc(result * sizeof(wchar_t));
                if (!new_path) {
                        SetLastError(ERROR_OUTOFMEMORY);
                        return FALSE;
                }
+               result = GetCurrentDirectoryW(result, new_path);
+               if (!result) {
+                       free(new_path);
+                       return FALSE;
+               }
        }
        if (wcsncmp(new_path, L"\\\\", 2) == 0 ||
            wcsncmp(new_path, L"//", 2) == 0)
index 6f3ba1bea2a6a76c0934c7a15f3a277c2b88318b..8a65b0ce51249983decad61d486b065468f8686d 100644 (file)
@@ -1870,16 +1870,18 @@ PyDoc_STRVAR(setdefault_doc__,
 "D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D");
 
 PyDoc_STRVAR(pop__doc__,
-"D.pop(k[,d]) -> v, remove specified key and return the corresponding value\n\
+"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\
 If key is not found, d is returned if given, otherwise KeyError is raised");
 
 PyDoc_STRVAR(popitem__doc__,
 "D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
-2-tuple; but raise KeyError if D is empty");
+2-tuple; but raise KeyError if D is empty.");
 
 PyDoc_STRVAR(update__doc__,
-"D.update(E, **F) -> None.  Update D from E and F: for k in E: D[k] = E[k]\
-\n(if E has keys else: for (k, v) in E: D[k] = v) then: for k in F: D[k] = F[k]");
+"D.update(E, **F) -> None.  Update D from dict/iterable E and F.\n"
+"If E has a .keys() method, does:     for k in E: D[k] = E[k]\n\
+If E lacks .keys() method, does:     for (k, v) in E: D[k] = v\n\
+In either case, this is followed by: for k in F: D[k] = F[k]");
 
 PyDoc_STRVAR(fromkeys__doc__,
 "dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
index 6bf65e03c765676bccf9dd1eef3cbd2ac6db696b..89eac6466d11508cd0ce37fda2e12f7135811671 100644 (file)
@@ -1457,7 +1457,7 @@ float_as_integer_ratio(PyObject *v, PyObject *unused)
 #ifdef Py_NAN
        if (Py_IS_NAN(self)) {
          PyErr_SetString(PyExc_ValueError,
-                         "Cannot pass nan to float.as_integer_ratio.");
+                         "Cannot pass NaN to float.as_integer_ratio.");
          return NULL;
        }
 #endif
@@ -1516,7 +1516,7 @@ PyDoc_STRVAR(float_as_integer_ratio_doc,
 "\n"
 "Returns a pair of integers, whose ratio is exactly equal to the original\n"
 "float and with a positive denominator.\n"
-"Raises OverflowError on infinities and a ValueError on nans.\n"
+"Raises OverflowError on infinities and a ValueError on NaNs.\n"
 "\n"
 ">>> (10.0).as_integer_ratio()\n"
 "(10, 1)\n"
index dc910f6809f624d74e5de4b333690cba1b430660..d5acec1f05105ddcfc52a2dd044c7183ca57fcca 100644 (file)
@@ -2286,11 +2286,14 @@ PyDoc_STRVAR(extend_doc,
 PyDoc_STRVAR(insert_doc,
 "L.insert(index, object) -- insert object before index");
 PyDoc_STRVAR(pop_doc,
-"L.pop([index]) -> item -- remove and return item at index (default last)");
+"L.pop([index]) -> item -- remove and return item at index (default last).\n"
+"Raises IndexError if list is empty or index is out of range.");
 PyDoc_STRVAR(remove_doc,
-"L.remove(value) -- remove first occurrence of value");
+"L.remove(value) -- remove first occurrence of value.\n"
+"Raises ValueError if the value is not present.");
 PyDoc_STRVAR(index_doc,
-"L.index(value, [start, [stop]]) -> integer -- return first index of value");
+"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
+"Raises ValueError if the value is not present.");
 PyDoc_STRVAR(count_doc,
 "L.count(value) -> integer -- return number of occurrences of value");
 PyDoc_STRVAR(reverse_doc,
index 10541662b637a1596074a7ff8aa3f5cfadadafa8..d24e1af0d2bd757672b3fc6042b94851e295ff65 100644 (file)
@@ -746,7 +746,8 @@ set_pop(PySetObject *so)
        return key;
 }
 
-PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.");
+PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.\n\
+Raises KeyError if the set is empty.");
 
 static int
 set_traverse(PySetObject *so, visitproc visit, void *arg)
@@ -1861,7 +1862,7 @@ PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
 static PyObject *
 set_remove(PySetObject *so, PyObject *key)
 {
-       PyObject *tmpkey, *result;
+       PyObject *tmpkey;
        int rv;
 
        rv = set_discard_key(so, key);
@@ -1873,11 +1874,14 @@ set_remove(PySetObject *so, PyObject *key)
                if (tmpkey == NULL)
                        return NULL;
                set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
-               result = set_remove(so, tmpkey);
+               rv = set_discard_key(so, tmpkey);
                set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
                Py_DECREF(tmpkey);
-               return result;
-       } else if (rv == DISCARD_NOTFOUND) {
+               if (rv == -1)
+                       return NULL;
+       } 
+
+       if (rv == DISCARD_NOTFOUND) {
                set_key_error(key);
                return NULL;
        }
index 963d90e1a9e0adaefa93e9a31a086b40720aa888..679ba8f5851d845a0e0be545ca87f6c680f8b6dd 100644 (file)
@@ -694,7 +694,9 @@ tuple_sizeof(PyTupleObject *self)
 }
 
 PyDoc_STRVAR(index_doc,
-"T.index(value, [start, [stop]]) -> integer -- return first index of value");
+"T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
+"Raises ValueError if the value is not present."
+);
 PyDoc_STRVAR(count_doc,
 "T.count(value) -> integer -- return number of occurrences of value");
 PyDoc_STRVAR(sizeof_doc,
index 0c5c6ef7539570fd6d39ee5ec6559f2b7f7932e7..ecd44cb78831b608f2ff1f0afe0192e992797551 100644 (file)
@@ -7300,7 +7300,7 @@ unicode_length(PyUnicodeObject *self)
 PyDoc_STRVAR(ljust__doc__,
 "S.ljust(width[, fillchar]) -> str\n\
 \n\
-Return S left justified in a Unicode string of length width. Padding is\n\
+Return S left-justified in a Unicode string of length width. Padding is\n\
 done using the specified fill character (default is a space).");
 
 static PyObject *
@@ -7815,7 +7815,7 @@ unicode_rindex(PyUnicodeObject *self, PyObject *args)
 PyDoc_STRVAR(rjust__doc__,
 "S.rjust(width[, fillchar]) -> str\n\
 \n\
-Return S right justified in a string of length width. Padding is\n\
+Return S right-justified in a string of length width. Padding is\n\
 done using the specified fill character (default is a space).");
 
 static PyObject *
@@ -7945,7 +7945,7 @@ PyDoc_STRVAR(partition__doc__,
 \n\
 Search for the separator sep in S, and return the part before it,\n\
 the separator itself, and the part after it.  If the separator is not\n\
-found, returns S and two empty strings.");
+found, return S and two empty strings.");
 
 static PyObject*
 unicode_partition(PyUnicodeObject *self, PyObject *separator)
@@ -7958,7 +7958,7 @@ PyDoc_STRVAR(rpartition__doc__,
 \n\
 Search for the separator sep in S, starting at the end of S, and return\n\
 the part before it, the separator itself, and the part after it.  If the\n\
-separator is not found, returns two empty strings and S.");
+separator is not found, return two empty strings and S.");
 
 static PyObject*
 unicode_rpartition(PyUnicodeObject *self, PyObject *separator)
index b89896c86014f9ea26020dded63e1bd985e79d86..90afb75da82a188378f8f9e1759cdd9f699f9f67 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -730,7 +730,8 @@ class PyBuildExt(build_ext):
             ]
             sqlite_libfile = self.compiler.find_library_file(
                                 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
-            sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
+            if sqlite_libfile:
+                sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
 
         if sqlite_incdir and sqlite_libdir:
             sqlite_srcs = ['_sqlite/cache.c',