From f07d0026da4330724ae2f17fb453db3d7f539e56 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sat, 21 Mar 2009 17:31:58 +0000 Subject: [PATCH] Merged revisions 70342,70385-70387,70389-70390,70392-70393,70395,70400,70405-70406,70418,70438,70464,70468 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r70342 | georg.brandl | 2009-03-13 14:03:58 -0500 (Fri, 13 Mar 2009) | 1 line #5486: typos. ........ r70385 | benjamin.peterson | 2009-03-15 09:38:55 -0500 (Sun, 15 Mar 2009) | 1 line fix tuple.index() error message #5495 ........ r70386 | georg.brandl | 2009-03-15 16:32:06 -0500 (Sun, 15 Mar 2009) | 1 line #5496: fix docstring of lookup(). ........ r70387 | georg.brandl | 2009-03-15 16:37:16 -0500 (Sun, 15 Mar 2009) | 1 line #5493: clarify __nonzero__ docs. ........ r70389 | georg.brandl | 2009-03-15 16:43:38 -0500 (Sun, 15 Mar 2009) | 1 line Fix a small nit in the error message if bool() falls back on __len__ and it returns the wrong type: it would tell the user that __nonzero__ should return bool or int. ........ r70390 | georg.brandl | 2009-03-15 16:44:43 -0500 (Sun, 15 Mar 2009) | 1 line #5491: clarify nested() semantics. ........ r70392 | georg.brandl | 2009-03-15 16:46:00 -0500 (Sun, 15 Mar 2009) | 1 line #5488: add missing struct member. ........ r70393 | georg.brandl | 2009-03-15 16:47:42 -0500 (Sun, 15 Mar 2009) | 1 line #5478: fix copy-paste oversight in function signature. ........ r70395 | georg.brandl | 2009-03-15 16:51:48 -0500 (Sun, 15 Mar 2009) | 1 line #5276: document IDLESTARTUP and .Idle.py. ........ r70400 | georg.brandl | 2009-03-15 16:59:37 -0500 (Sun, 15 Mar 2009) | 3 lines Fix markup in re docs and give a mail address in regex howto, so that the recommendation to send suggestions to the author can be followed. ........ r70405 | georg.brandl | 2009-03-15 17:11:07 -0500 (Sun, 15 Mar 2009) | 7 lines Move the previously local import of threading to module level. This is cleaner and avoids lockups in obscure cases where a Queue is instantiated while the import lock is already held by another thread. OKed by Tim Peters. ........ r70406 | hirokazu.yamamoto | 2009-03-15 17:43:14 -0500 (Sun, 15 Mar 2009) | 1 line Added skip for old MSVC. ........ r70418 | georg.brandl | 2009-03-16 14:42:03 -0500 (Mon, 16 Mar 2009) | 1 line Add token markup. ........ r70438 | benjamin.peterson | 2009-03-17 15:29:51 -0500 (Tue, 17 Mar 2009) | 1 line I thought this was begging for an example ........ r70464 | benjamin.peterson | 2009-03-18 15:58:09 -0500 (Wed, 18 Mar 2009) | 1 line a much better example ........ r70468 | benjamin.peterson | 2009-03-18 22:04:31 -0500 (Wed, 18 Mar 2009) | 1 line close files after comparing them ........ --- Doc/c-api/typeobj.rst | 1 + Doc/howto/regex.rst | 2 +- Doc/library/contextlib.rst | 9 +++++---- Doc/library/functions.rst | 8 ++++++++ Doc/library/idle.rst | 18 ++++++++++++++++++ Doc/library/re.rst | 2 +- Doc/library/string.rst | 2 +- Doc/library/xml.dom.rst | 2 +- Doc/reference/datamodel.rst | 11 ++++++----- Lib/distutils/tests/test_msvc9compiler.py | 4 ++++ Lib/filecmp.py | 18 +++++++++--------- Modules/_codecsmodule.c | 2 +- Objects/tupleobject.c | 2 +- Objects/typeobject.c | 16 +++++++++------- 14 files changed, 66 insertions(+), 31 deletions(-) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 2e2f9c4f0e..eba8d6951c 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1052,6 +1052,7 @@ Number Object Structures binaryfunc nb_inplace_add; binaryfunc nb_inplace_subtract; binaryfunc nb_inplace_multiply; + binaryfunc nb_inplace_divide; binaryfunc nb_inplace_remainder; ternaryfunc nb_inplace_power; binaryfunc nb_inplace_lshift; diff --git a/Doc/howto/regex.rst b/Doc/howto/regex.rst index c74fd3984f..3ed53686d3 100644 --- a/Doc/howto/regex.rst +++ b/Doc/howto/regex.rst @@ -4,7 +4,7 @@ Regular Expression HOWTO **************************** -:Author: A.M. Kuchling +:Author: A.M. Kuchling :Release: 0.05 .. TODO: diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 74a68cfc82..e2ca6a1a8e 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -61,14 +61,15 @@ Functions provided: from contextlib import nested - with nested(A, B, C) as (X, Y, Z): + with nested(A(), B(), C()) as (X, Y, Z): do_something() is equivalent to this:: - with A as X: - with B as Y: - with C as Z: + m1, m2, m3 = A(), B(), C() + with m1 as X: + with m2 as Y: + with m3 as Z: do_something() Note that if the :meth:`__exit__` method of one of the nested context managers diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index e807e79c06..4d8a845251 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -561,6 +561,14 @@ are always available. They are listed here in alphabetical order. its :meth:`__next__` method; if the value returned is equal to *sentinel*, :exc:`StopIteration` will be raised, otherwise the value will be returned. + One useful application of the second form of :func:`iter` is to read lines of + a file until a certain line is reached. The following example reads a file + until ``"STOP"`` is reached: :: + + with open("mydata.txt") as fp: + for line in iter(fp.readline, "STOP"): + process_line(line) + .. function:: len(s) diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 413750fda5..1b78fb9bc1 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -253,6 +253,24 @@ Shell colors: black +Startup +------- + +Upon startup with the ``-s`` option, IDLE will execute the file referenced by +the environment variables :envvar:`IDLESTARTUP` or :envvar:`PYTHONSTARTUP`. +Idle first checks for ``IDLESTARTUP``; if ``IDLESTARTUP`` is present the file +referenced is run. If ``IDLESTARTUP`` is not present, Idle checks for +``PYTHONSTARTUP``. Files referenced by these environment variables are +convenient places to store functions that are used frequently from the Idle +shell, or for executing import statements to import common modules. + +In addition, ``Tk`` also loads a startup file if it is present. Note that the +Tk file is loaded unconditionally. This additional file is ``.Idle.py`` and is +looked for in the user's home directory. Statements in this file will be +executed in the Tk namespace, so this file is not useful for importing functions +to be used from Idle's Python shell. + + Command line usage ^^^^^^^^^^^^^^^^^^ diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 6e499a0ebb..0dbd0e2932 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -1127,7 +1127,7 @@ For example: string)`` or ``re.search(pattern, string)``. :func:`match` has an optional second parameter that gives an index in the string -where the search is to start: +where the search is to start:: >>> pattern = re.compile("o") >>> pattern.match("dog") # No match as "o" is not at the start of "dog." diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 98c7051298..2e444adf34 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -196,7 +196,7 @@ The grammar for a replacement field is as follows: .. productionlist:: sf replacement_field: "{" `field_name` ["!" `conversion`] [":" `format_spec`] "}" - field_name: (`identifier` | `integer`) ("." `attribute_name` | "[" element_index "]")* + field_name: (`identifier` | `integer`) ("." `attribute_name` | "[" `element_index` "]")* attribute_name: `identifier` element_index: `integer` conversion: "r" | "s" | "a" diff --git a/Doc/library/xml.dom.rst b/Doc/library/xml.dom.rst index 2a0c788abb..bf1b151385 100644 --- a/Doc/library/xml.dom.rst +++ b/Doc/library/xml.dom.rst @@ -600,7 +600,7 @@ of that class. Same as equivalent method in the :class:`Document` class. -.. method:: Element.getElementsByTagNameNS(tagName) +.. method:: Element.getElementsByTagNameNS(namespaceURI, localName) Same as equivalent method in the :class:`Document` class. diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 2e4a77698f..49f2be6fc3 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1251,11 +1251,12 @@ Basic customization .. index:: single: __len__() (mapping object method) - Called to implement truth value testing, and the built-in operation ``bool()``; - should return ``False`` or ``True``. When this method is not defined, - :meth:`__len__` is called, if it is defined (see below) and ``True`` is returned - when the length is not zero. If a class defines neither :meth:`__len__` nor - :meth:`__bool__`, all its instances are considered true. + Called to implement truth value testing and the built-in operation + ``bool()``; should return ``False`` or ``True``, or their integer equivalents + ``0`` or ``1``. When this method is not defined, :meth:`__len__` is called, + if it is defined, and the object is considered true if its result is nonzero. + If a class defines neither :meth:`__len__` nor :meth:`__bool__`, all its + instances are considered true. .. _attribute-access: diff --git a/Lib/distutils/tests/test_msvc9compiler.py b/Lib/distutils/tests/test_msvc9compiler.py index e7d1620fdd..aefadd6dc3 100644 --- a/Lib/distutils/tests/test_msvc9compiler.py +++ b/Lib/distutils/tests/test_msvc9compiler.py @@ -34,6 +34,10 @@ class msvc9compilerTestCase(unittest.TestCase): if sys.platform != 'win32': # this test is only for win32 return + from distutils.msvccompiler import get_build_version + if get_build_version() < 8.0: + # this test is only for MSVC8.0 or above + return from distutils.msvc9compiler import Reg self.assertRaises(KeyError, Reg.get_value, 'xxx', 'xxx') diff --git a/Lib/filecmp.py b/Lib/filecmp.py index 6dcebaa23d..4cbb0d682b 100644 --- a/Lib/filecmp.py +++ b/Lib/filecmp.py @@ -11,6 +11,7 @@ Functions: import os import stat +import contextlib from itertools import filterfalse __all__ = ["cmp","dircmp","cmpfiles"] @@ -62,15 +63,14 @@ def _sig(st): def _do_cmp(f1, f2): bufsize = BUFSIZE - fp1 = open(f1, 'rb') - fp2 = open(f2, 'rb') - while True: - b1 = fp1.read(bufsize) - b2 = fp2.read(bufsize) - if b1 != b2: - return False - if not b1: - return True + with contextlib.nested(open(f1, 'rb'), open(f2, 'rb')) as (fp1, fp2): + while True: + b1 = fp1.read(bufsize) + b2 = fp2.read(bufsize) + if b1 != b2: + return False + if not b1: + return True # Directory comparison class. # diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c index e7dbf89499..cbcf84dd07 100644 --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -61,7 +61,7 @@ PyDoc_STRVAR(lookup__doc__, "lookup(encoding) -> CodecInfo\n\ \n\ Looks up a codec tuple in the Python codec registry and returns\n\ -a tuple of function (or a CodecInfo object)."); +a CodecInfo object."); static PyObject *codec_lookup(PyObject *self, PyObject *args) diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index f7b316b181..8828a2d5e6 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -458,7 +458,7 @@ tupleindex(PyTupleObject *self, PyObject *args) else if (cmp < 0) return NULL; } - PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in list"); + PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in tuple"); return NULL; } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index a362b8457d..47bc0bb9b7 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4785,7 +4785,7 @@ slot_nb_bool(PyObject *self) PyObject *func, *args; static PyObject *bool_str, *len_str; int result = -1; - int from_len = 0; + int using_len = 0; func = lookup_maybe(self, "__bool__", &bool_str); if (func == NULL) { @@ -4794,14 +4794,14 @@ slot_nb_bool(PyObject *self) func = lookup_maybe(self, "__len__", &len_str); if (func == NULL) return PyErr_Occurred() ? -1 : 1; - from_len = 1; - } + using_len = 1; + } args = PyTuple_New(0); if (args != NULL) { PyObject *temp = PyObject_Call(func, args, NULL); Py_DECREF(args); if (temp != NULL) { - if (from_len) { + if (using_len) { /* enforced by slot_nb_len */ result = PyObject_IsTrue(temp); } @@ -4810,9 +4810,11 @@ slot_nb_bool(PyObject *self) } else { PyErr_Format(PyExc_TypeError, - "__bool__ should return " - "bool, returned %s", - Py_TYPE(temp)->tp_name); + "%s should return " + "bool or int, returned %s", + (using_len ? "__len__" + : "__bool__"), + Py_TYPE(temp)->tp_name); result = -1; } Py_DECREF(temp); -- 2.40.0