[Python-checkins] r64654 - in python/branches/tlee-ast-optimize: Doc/glossary.rst Doc/library/abc.rst Doc/library/msilib.rst Doc/library/stdtypes.rst Doc/library/subprocess.rst Doc/library/urllib.rst Doc/reference/expressions.rst Doc/whatsnew/2.6.rst Lib/test/test_file.py Lib/test/test_syntax.py Lib/test/test_urllib.py Lib/test/test_urllibnet.py Lib/urllib.py Misc/NEWS Python/ast.c Python/ceval.c

thomas.lee python-checkins at python.org
Wed Jul 2 09:11:20 CEST 2008


Author: thomas.lee
Date: Wed Jul  2 09:11:19 2008
New Revision: 64654

Log:
Merged revisions 64612-64653 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r64622 | benjamin.peterson | 2008-07-02 05:34:52 +1000 (Wed, 02 Jul 2008) | 1 line
  
  #3219 repeated keyword arguments aren't allowed in function calls anymore
........
  r64623 | benjamin.peterson | 2008-07-02 05:51:54 +1000 (Wed, 02 Jul 2008) | 1 line
  
  write a short little section for multiprocessing; it still needs help
........
  r64625 | georg.brandl | 2008-07-02 05:59:00 +1000 (Wed, 02 Jul 2008) | 2 lines
  
  Add a link to PEP 324.
........
  r64630 | georg.brandl | 2008-07-02 06:18:10 +1000 (Wed, 02 Jul 2008) | 2 lines
  
  #3216: fix Execute's parameter description.
........
  r64633 | amaury.forgeotdarc | 2008-07-02 06:38:04 +1000 (Wed, 02 Jul 2008) | 5 lines
  
  #3242: fix a crash in "print", if sys.stdout is set to a custom object,
  whose write() method installs another sys.stdout.
  
  Will backport.
........
  r64635 | georg.brandl | 2008-07-02 06:45:09 +1000 (Wed, 02 Jul 2008) | 2 lines
  
  #1523853: add note about fread().
........
  r64638 | georg.brandl | 2008-07-02 06:50:02 +1000 (Wed, 02 Jul 2008) | 2 lines
  
  #1410739: add a footnote about "is" and "unusual" behavior.
........
  r64640 | georg.brandl | 2008-07-02 06:56:03 +1000 (Wed, 02 Jul 2008) | 2 lines
  
  Add a comment about incref'ing w.
........
  r64647 | benjamin.peterson | 2008-07-02 09:33:06 +1000 (Wed, 02 Jul 2008) | 1 line
  
  add ABC to the glossary
........
  r64649 | brett.cannon | 2008-07-02 11:57:08 +1000 (Wed, 02 Jul 2008) | 8 lines
  
  Handle urllib's renaming for Python 3.0:
  
  * Deprecate urllib.urlopen() in favor of urllib2.urlopen() for 3.0.
  * Update docs to mention split/rename of the module and deprecation of
    urlopen().
  
  Changes to lib2to3 are in a separate commit. Work is for issue #2885.
........


Modified:
   python/branches/tlee-ast-optimize/   (props changed)
   python/branches/tlee-ast-optimize/Doc/glossary.rst
   python/branches/tlee-ast-optimize/Doc/library/abc.rst
   python/branches/tlee-ast-optimize/Doc/library/msilib.rst
   python/branches/tlee-ast-optimize/Doc/library/stdtypes.rst
   python/branches/tlee-ast-optimize/Doc/library/subprocess.rst
   python/branches/tlee-ast-optimize/Doc/library/urllib.rst
   python/branches/tlee-ast-optimize/Doc/reference/expressions.rst
   python/branches/tlee-ast-optimize/Doc/whatsnew/2.6.rst
   python/branches/tlee-ast-optimize/Lib/test/test_file.py
   python/branches/tlee-ast-optimize/Lib/test/test_syntax.py
   python/branches/tlee-ast-optimize/Lib/test/test_urllib.py
   python/branches/tlee-ast-optimize/Lib/test/test_urllibnet.py
   python/branches/tlee-ast-optimize/Lib/urllib.py
   python/branches/tlee-ast-optimize/Misc/NEWS
   python/branches/tlee-ast-optimize/Python/ast.c
   python/branches/tlee-ast-optimize/Python/ceval.c

Modified: python/branches/tlee-ast-optimize/Doc/glossary.rst
==============================================================================
--- python/branches/tlee-ast-optimize/Doc/glossary.rst	(original)
+++ python/branches/tlee-ast-optimize/Doc/glossary.rst	Wed Jul  2 09:11:19 2008
@@ -24,6 +24,14 @@
       2to3 is available in the standard library as :mod:`lib2to3`; a standalone
       entry point is provided as :file:`Tools/scripts/2to3`.
 
+   Abstract Base Class
+      Abstract Base Classes (abbreviated ABCs) complement :term:`duck-typing` by
+      providing a way to define interfaces when other techniques like :func:`hasattr`
+      would be clumsy. Python comes with many builtin ABCs for data structures
+      (in the :mod:`collections` module), numbers (in the :mod:`numbers`
+      module), and streams (in the :mod:`io` module). You can create your own
+      ABC with the :mod:`abc` module.
+
    argument
       A value passed to a function or method, assigned to a name local to
       the body.  A function or method may have both positional arguments and
@@ -116,15 +124,16 @@
       be any object with a :meth:`__hash__` function, not just integers starting
       from zero.  Called a hash in Perl.
     
-   duck-typing
+   duck-typing 
       Pythonic programming style that determines an object's type by inspection
       of its method or attribute signature rather than by explicit relationship
       to some type object ("If it looks like a duck and quacks like a duck, it
       must be a duck.")  By emphasizing interfaces rather than specific types,
       well-designed code improves its flexibility by allowing polymorphic
       substitution.  Duck-typing avoids tests using :func:`type` or
-      :func:`isinstance`. Instead, it typically employs :func:`hasattr` tests or
-      :term:`EAFP` programming.
+      :func:`isinstance`. (Note, however, that duck-typing can be complemented
+      with abstract base classes.) Instead, it typically employs :func:`hasattr`
+      tests or :term:`EAFP` programming.
     
    EAFP
       Easier to ask for forgiveness than permission.  This common Python coding

Modified: python/branches/tlee-ast-optimize/Doc/library/abc.rst
==============================================================================
--- python/branches/tlee-ast-optimize/Doc/library/abc.rst	(original)
+++ python/branches/tlee-ast-optimize/Doc/library/abc.rst	Wed Jul  2 09:11:19 2008
@@ -9,10 +9,10 @@
 
 .. versionadded:: 2.6
 
-This module provides the infrastructure for defining abstract base classes
-(ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this was added
-to Python. (See also :pep:`3141` and the :mod:`numbers` module regarding a type
-hierarchy for numbers based on ABCs.)
+This module provides the infrastructure for defining :term:`abstract base
+classes` (ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this
+was added to Python. (See also :pep:`3141` and the :mod:`numbers` module
+regarding a type hierarchy for numbers based on ABCs.)
 
 The :mod:`collections` module has some concrete classes that derive from
 ABCs; these can, of course, be further derived. In addition the

Modified: python/branches/tlee-ast-optimize/Doc/library/msilib.rst
==============================================================================
--- python/branches/tlee-ast-optimize/Doc/library/msilib.rst	(original)
+++ python/branches/tlee-ast-optimize/Doc/library/msilib.rst	Wed Jul  2 09:11:19 2008
@@ -1,4 +1,3 @@
-
 :mod:`msilib` --- Read and write Microsoft Installer files
 ==========================================================
 
@@ -165,11 +164,11 @@
 ------------
 
 
-.. method:: View.Execute([params=None])
+.. method:: View.Execute(params)
 
-   Execute the SQL query of the view, through :cfunc:`MSIViewExecute`. *params* is
-   an optional record describing actual values of the parameter tokens in the
-   query.
+   Execute the SQL query of the view, through :cfunc:`MSIViewExecute`. If
+   *params* is not ``None``, it is a record describing actual values of the
+   parameter tokens in the query.
 
 
 .. method:: View.GetColumnInfo(kind)

Modified: python/branches/tlee-ast-optimize/Doc/library/stdtypes.rst
==============================================================================
--- python/branches/tlee-ast-optimize/Doc/library/stdtypes.rst	(original)
+++ python/branches/tlee-ast-optimize/Doc/library/stdtypes.rst	Wed Jul  2 09:11:19 2008
@@ -2058,6 +2058,10 @@
    that when in non-blocking mode, less data than what was requested may be
    returned, even if no *size* parameter was given.
 
+   .. note::
+      As this function depends of the underlying C function :cfunc:`fread`,
+      it resembles its behaviour in details like caching EOF and others.
+
 
 .. method:: file.readline([size])
 

Modified: python/branches/tlee-ast-optimize/Doc/library/subprocess.rst
==============================================================================
--- python/branches/tlee-ast-optimize/Doc/library/subprocess.rst	(original)
+++ python/branches/tlee-ast-optimize/Doc/library/subprocess.rst	Wed Jul  2 09:11:19 2008
@@ -23,6 +23,10 @@
 Information about how the :mod:`subprocess` module can be used to replace these
 modules and functions can be found in the following sections.
 
+.. seealso::
+
+   :pep:`324` -- PEP proposing the subprocess module
+
 
 Using the subprocess Module
 ---------------------------

Modified: python/branches/tlee-ast-optimize/Doc/library/urllib.rst
==============================================================================
--- python/branches/tlee-ast-optimize/Doc/library/urllib.rst	(original)
+++ python/branches/tlee-ast-optimize/Doc/library/urllib.rst	Wed Jul  2 09:11:19 2008
@@ -4,6 +4,13 @@
 .. module:: urllib
    :synopsis: Open an arbitrary network resource by URL (requires sockets).
 
+.. note::
+    The :mod:`urllib` module has been split into parts and renamed in
+    Python 3.0 to :mod:`urllib.request`, :mod:`urllib.parse`,
+    and :mod:`urllib.error`. The :term:`2to3` tool will automatically adapt
+    imports when converting your sources to 3.0.
+    Also note that the :func:`urllib.urlopen` function has been removed in
+    Python 3.0 in favor of :func:`urllib2.urlopen`.
 
 .. index::
    single: WWW
@@ -116,6 +123,10 @@
    .. versionchanged:: 2.6
       Added :meth:`getcode` to returned object and support for the
       :envvar:`no_proxy` environment variable.
+      
+   .. deprecated:: 2.6
+      The :func:`urlopen` function has been removed in Python 3.0 in favor
+      of :func:`urllib2.urlopen`.
 
 
 .. function:: urlretrieve(url[, filename[, reporthook[, data]]])

Modified: python/branches/tlee-ast-optimize/Doc/reference/expressions.rst
==============================================================================
--- python/branches/tlee-ast-optimize/Doc/reference/expressions.rst	(original)
+++ python/branches/tlee-ast-optimize/Doc/reference/expressions.rst	Wed Jul  2 09:11:19 2008
@@ -1113,7 +1113,7 @@
 
 The operators :keyword:`is` and :keyword:`is not` test for object identity: ``x
 is y`` is true if and only if *x* and *y* are the same object.  ``x is not y``
-yields the inverse truth value.
+yields the inverse truth value. [#]_
 
 
 .. _booleans:
@@ -1352,3 +1352,7 @@
    only, but this caused surprises because people expected to be able to test a
    dictionary for emptiness by comparing it to ``{}``.
 
+.. [#] Due to automatic garbage-collection, free lists, and the dynamic nature of 
+   descriptors, you may notice seemingly unusual behaviour in certain uses of
+   the :keyword:`is` operator, like those involving comparisons between instance
+   methods, or constants.  Check their documentation for more info.

Modified: python/branches/tlee-ast-optimize/Doc/whatsnew/2.6.rst
==============================================================================
--- python/branches/tlee-ast-optimize/Doc/whatsnew/2.6.rst	(original)
+++ python/branches/tlee-ast-optimize/Doc/whatsnew/2.6.rst	Wed Jul  2 09:11:19 2008
@@ -526,7 +526,21 @@
 PEP 371: The ``multiprocessing`` Package
 =====================================================
 
-XXX write this.
+.. XXX I think this still needs help
+
+:mod:`multiprocessing` makes it easy to distribute work over multiple processes.
+Its API is similiar to that of :mod:`threading`.  For example::
+
+    from multiprocessing import Process
+
+    def long_hard_task(n):
+        print n * 43
+
+    for i in range(10):
+        Process(target=long_hard_task, args=(i)).start()
+
+will multiply the numbers between 0 and 10 times 43 and print out the result
+concurrently.
 
 .. seealso::
 

Modified: python/branches/tlee-ast-optimize/Lib/test/test_file.py
==============================================================================
--- python/branches/tlee-ast-optimize/Lib/test/test_file.py	(original)
+++ python/branches/tlee-ast-optimize/Lib/test/test_file.py	Wed Jul  2 09:11:19 2008
@@ -503,13 +503,31 @@
         self._test_close_open_io(io_func)
 
 
+class StdoutTests(unittest.TestCase):
+
+    def test_move_stdout_on_write(self):
+        # Issue 3242: sys.stdout can be replaced (and freed) during a
+        # print statement; prevent a segfault in this case
+        save_stdout = sys.stdout
+
+        class File:
+            def write(self, data):
+                if '\n' in data:
+                    sys.stdout = save_stdout
+
+        try:
+            sys.stdout = File()
+            print "some text"
+        finally:
+            sys.stdout = save_stdout
+
 
 def test_main():
     # Historically, these tests have been sloppy about removing TESTFN.
     # So get rid of it no matter what.
     try:
         run_unittest(AutoFileTests, OtherFileTests, FileSubclassTests,
-            FileThreadingTests)
+            FileThreadingTests, StdoutTests)
     finally:
         if os.path.exists(TESTFN):
             os.unlink(TESTFN)

Modified: python/branches/tlee-ast-optimize/Lib/test/test_syntax.py
==============================================================================
--- python/branches/tlee-ast-optimize/Lib/test/test_syntax.py	(original)
+++ python/branches/tlee-ast-optimize/Lib/test/test_syntax.py	Wed Jul  2 09:11:19 2008
@@ -417,6 +417,11 @@
      ...
    SyntaxError: can't assign to function call (<doctest test.test_syntax[48]>, line 6)
 
+>>> f(a=23, a=234)
+Traceback (most recent call last):
+   ...
+SyntaxError: keyword argument repeated (<doctest test.test_syntax[49]>, line 1)
+
 """
 
 import re

Modified: python/branches/tlee-ast-optimize/Lib/test/test_urllib.py
==============================================================================
--- python/branches/tlee-ast-optimize/Lib/test/test_urllib.py	(original)
+++ python/branches/tlee-ast-optimize/Lib/test/test_urllib.py	Wed Jul  2 09:11:19 2008
@@ -640,16 +640,20 @@
 
 
 def test_main():
-    test_support.run_unittest(
-        urlopen_FileTests,
-        urlopen_HttpTests,
-        urlretrieve_FileTests,
-        QuotingTests,
-        UnquotingTests,
-        urlencode_Tests,
-        Pathname_Tests,
-        #FTPWrapperTests,
-    )
+    import warnings
+    with test_support.catch_warning(record=False):
+        warnings.filterwarnings('ignore', ".*urllib\.urlopen.*Python 3.0",
+                                DeprecationWarning)
+        test_support.run_unittest(
+            urlopen_FileTests,
+            urlopen_HttpTests,
+            urlretrieve_FileTests,
+            QuotingTests,
+            UnquotingTests,
+            urlencode_Tests,
+            Pathname_Tests,
+            #FTPWrapperTests,
+        )
 
 
 

Modified: python/branches/tlee-ast-optimize/Lib/test/test_urllibnet.py
==============================================================================
--- python/branches/tlee-ast-optimize/Lib/test/test_urllibnet.py	(original)
+++ python/branches/tlee-ast-optimize/Lib/test/test_urllibnet.py	Wed Jul  2 09:11:19 2008
@@ -182,9 +182,13 @@
 
 def test_main():
     test_support.requires('network')
-    test_support.run_unittest(URLTimeoutTest,
-                              urlopenNetworkTests,
-                              urlretrieveNetworkTests)
+    from warnings import filterwarnings
+    with test_support.catch_warning(record=False):
+        filterwarnings('ignore', '.*urllib\.urlopen.*Python 3.0',
+                        DeprecationWarning)
+        test_support.run_unittest(URLTimeoutTest,
+                                  urlopenNetworkTests,
+                                  urlretrieveNetworkTests)
 
 if __name__ == "__main__":
     test_main()

Modified: python/branches/tlee-ast-optimize/Lib/urllib.py
==============================================================================
--- python/branches/tlee-ast-optimize/Lib/urllib.py	(original)
+++ python/branches/tlee-ast-optimize/Lib/urllib.py	Wed Jul  2 09:11:19 2008
@@ -28,6 +28,7 @@
 import time
 import sys
 from urlparse import urljoin as basejoin
+import warnings
 
 __all__ = ["urlopen", "URLopener", "FancyURLopener", "urlretrieve",
            "urlcleanup", "quote", "quote_plus", "unquote", "unquote_plus",
@@ -69,7 +70,11 @@
 # Shortcut for basic usage
 _urlopener = None
 def urlopen(url, data=None, proxies=None):
-    """urlopen(url [, data]) -> open file-like object"""
+    """Create a file-like object for the specified URL to read from."""
+    from warnings import warnpy3k
+    warnings.warnpy3k("urllib.urlopen() has been removed in Python 3.0 in "
+                        "favor of urllib2.urlopen()", stacklevel=2)
+
     global _urlopener
     if proxies is not None:
         opener = FancyURLopener(proxies=proxies)

Modified: python/branches/tlee-ast-optimize/Misc/NEWS
==============================================================================
--- python/branches/tlee-ast-optimize/Misc/NEWS	(original)
+++ python/branches/tlee-ast-optimize/Misc/NEWS	Wed Jul  2 09:11:19 2008
@@ -10,6 +10,10 @@
 Core and Builtins
 -----------------
 
+- Issue #3242: Fix a crash inside the print statement, if sys.stdout is
+  set to a custom object whose write() method happens to install
+  another file in sys.stdout.
+
 - Issue #3088: Corrected a race condition in classes derived from
   threading.local: the first member set by a thread could be saved in
   another thread's dictionary.
@@ -21,11 +25,28 @@
   slice(None, 10, -1).indices(10) returns (9, 9, -1) instead of (9,
   10, -1).
 
+- Issue #3219: Calling a function with repeated keyword arguments, f(a=2, a=23),
+  would not cause a syntax error.  This was regression from 2.4 caused by the
+  switch to the new compiler.
+
+
+Library
+-------
+
+- Issue #2885 (partial): The urllib.urlopen() function has been deprecated for
+  removal in Python 3.0 in favor of urllib2.urlopen().
+
+- Issue #2885 (partial): lib2to3 has been updated to handle the renaming of the
+  urllib module in Python 3.0 to urllib.request, urllib.parse, and
+  urllib.error.
+
+
 Build
 -----
 
 - Issue #3215: Build sqlite3 as sqlite3.dll, not sqlite3.pyd.
 
+
 What's New in Python 2.6 beta 1?
 ================================
 

Modified: python/branches/tlee-ast-optimize/Python/ast.c
==============================================================================
--- python/branches/tlee-ast-optimize/Python/ast.c	(original)
+++ python/branches/tlee-ast-optimize/Python/ast.c	Wed Jul  2 09:11:19 2008
@@ -1912,6 +1912,8 @@
             else {
                 keyword_ty kw;
                 identifier key;
+                int k;
+                char *tmp;
 
                 /* CHILD(ch, 0) is test, but must be an identifier? */ 
                 e = ast_for_expr(c, CHILD(ch, 0));
@@ -1933,6 +1935,14 @@
                 key = e->v.Name.id;
                 if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key)))
                     return NULL;
+                for (k = 0; k < nkeywords; k++) {
+                    tmp = PyString_AS_STRING(
+                        ((keyword_ty)asdl_seq_GET(keywords, k))->arg);
+                    if (!strcmp(tmp, PyString_AS_STRING(key))) {
+                        ast_error(CHILD(ch, 0), "keyword argument repeated");
+                        return NULL;
+                    }
+                }
                 e = ast_for_expr(c, CHILD(ch, 2));
                 if (!e)
                     return NULL;

Modified: python/branches/tlee-ast-optimize/Python/ceval.c
==============================================================================
--- python/branches/tlee-ast-optimize/Python/ceval.c	(original)
+++ python/branches/tlee-ast-optimize/Python/ceval.c	Wed Jul  2 09:11:19 2008
@@ -1617,9 +1617,13 @@
 							"lost sys.stdout");
 			}
 			if (w != NULL) {
+				/* w.write() may replace sys.stdout, so we
+				 * have to keep our reference to it */
+				Py_INCREF(w);
 				err = PyFile_WriteString("\n", w);
 				if (err == 0)
 					PyFile_SoftSpace(w, 0);
+				Py_DECREF(w);
 			}
 			Py_XDECREF(stream);
 			stream = NULL;


More information about the Python-checkins mailing list