mirror of
https://github.com/python/cpython.git
synced 2025-08-02 08:02:56 +00:00
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 ........
This commit is contained in:
parent
839d6cac82
commit
f07d0026da
14 changed files with 66 additions and 31 deletions
|
@ -1052,6 +1052,7 @@ Number Object Structures
|
||||||
binaryfunc nb_inplace_add;
|
binaryfunc nb_inplace_add;
|
||||||
binaryfunc nb_inplace_subtract;
|
binaryfunc nb_inplace_subtract;
|
||||||
binaryfunc nb_inplace_multiply;
|
binaryfunc nb_inplace_multiply;
|
||||||
|
binaryfunc nb_inplace_divide;
|
||||||
binaryfunc nb_inplace_remainder;
|
binaryfunc nb_inplace_remainder;
|
||||||
ternaryfunc nb_inplace_power;
|
ternaryfunc nb_inplace_power;
|
||||||
binaryfunc nb_inplace_lshift;
|
binaryfunc nb_inplace_lshift;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
Regular Expression HOWTO
|
Regular Expression HOWTO
|
||||||
****************************
|
****************************
|
||||||
|
|
||||||
:Author: A.M. Kuchling
|
:Author: A.M. Kuchling <amk@amk.ca>
|
||||||
:Release: 0.05
|
:Release: 0.05
|
||||||
|
|
||||||
.. TODO:
|
.. TODO:
|
||||||
|
|
|
@ -61,14 +61,15 @@ Functions provided:
|
||||||
|
|
||||||
from contextlib import nested
|
from contextlib import nested
|
||||||
|
|
||||||
with nested(A, B, C) as (X, Y, Z):
|
with nested(A(), B(), C()) as (X, Y, Z):
|
||||||
do_something()
|
do_something()
|
||||||
|
|
||||||
is equivalent to this::
|
is equivalent to this::
|
||||||
|
|
||||||
with A as X:
|
m1, m2, m3 = A(), B(), C()
|
||||||
with B as Y:
|
with m1 as X:
|
||||||
with C as Z:
|
with m2 as Y:
|
||||||
|
with m3 as Z:
|
||||||
do_something()
|
do_something()
|
||||||
|
|
||||||
Note that if the :meth:`__exit__` method of one of the nested context managers
|
Note that if the :meth:`__exit__` method of one of the nested context managers
|
||||||
|
|
|
@ -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*,
|
its :meth:`__next__` method; if the value returned is equal to *sentinel*,
|
||||||
:exc:`StopIteration` will be raised, otherwise the value will be returned.
|
: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)
|
.. function:: len(s)
|
||||||
|
|
||||||
|
|
|
@ -253,6 +253,24 @@ Shell colors:
|
||||||
black
|
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
|
Command line usage
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
|
@ -1127,7 +1127,7 @@ For example:
|
||||||
string)`` or ``re.search(pattern, string)``.
|
string)`` or ``re.search(pattern, string)``.
|
||||||
|
|
||||||
:func:`match` has an optional second parameter that gives an index in the 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 = re.compile("o")
|
||||||
>>> pattern.match("dog") # No match as "o" is not at the start of "dog."
|
>>> pattern.match("dog") # No match as "o" is not at the start of "dog."
|
||||||
|
|
|
@ -196,7 +196,7 @@ The grammar for a replacement field is as follows:
|
||||||
|
|
||||||
.. productionlist:: sf
|
.. productionlist:: sf
|
||||||
replacement_field: "{" `field_name` ["!" `conversion`] [":" `format_spec`] "}"
|
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`
|
attribute_name: `identifier`
|
||||||
element_index: `integer`
|
element_index: `integer`
|
||||||
conversion: "r" | "s" | "a"
|
conversion: "r" | "s" | "a"
|
||||||
|
|
|
@ -600,7 +600,7 @@ of that class.
|
||||||
Same as equivalent method in the :class:`Document` 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.
|
Same as equivalent method in the :class:`Document` class.
|
||||||
|
|
||||||
|
|
|
@ -1251,11 +1251,12 @@ Basic customization
|
||||||
|
|
||||||
.. index:: single: __len__() (mapping object method)
|
.. index:: single: __len__() (mapping object method)
|
||||||
|
|
||||||
Called to implement truth value testing, and the built-in operation ``bool()``;
|
Called to implement truth value testing and the built-in operation
|
||||||
should return ``False`` or ``True``. When this method is not defined,
|
``bool()``; should return ``False`` or ``True``, or their integer equivalents
|
||||||
:meth:`__len__` is called, if it is defined (see below) and ``True`` is returned
|
``0`` or ``1``. When this method is not defined, :meth:`__len__` is called,
|
||||||
when the length is not zero. If a class defines neither :meth:`__len__` nor
|
if it is defined, and the object is considered true if its result is nonzero.
|
||||||
:meth:`__bool__`, all its instances are considered true.
|
If a class defines neither :meth:`__len__` nor :meth:`__bool__`, all its
|
||||||
|
instances are considered true.
|
||||||
|
|
||||||
|
|
||||||
.. _attribute-access:
|
.. _attribute-access:
|
||||||
|
|
|
@ -34,6 +34,10 @@ class msvc9compilerTestCase(unittest.TestCase):
|
||||||
if sys.platform != 'win32':
|
if sys.platform != 'win32':
|
||||||
# this test is only for win32
|
# this test is only for win32
|
||||||
return
|
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
|
from distutils.msvc9compiler import Reg
|
||||||
self.assertRaises(KeyError, Reg.get_value, 'xxx', 'xxx')
|
self.assertRaises(KeyError, Reg.get_value, 'xxx', 'xxx')
|
||||||
|
|
|
@ -11,6 +11,7 @@ Functions:
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import stat
|
import stat
|
||||||
|
import contextlib
|
||||||
from itertools import filterfalse
|
from itertools import filterfalse
|
||||||
|
|
||||||
__all__ = ["cmp","dircmp","cmpfiles"]
|
__all__ = ["cmp","dircmp","cmpfiles"]
|
||||||
|
@ -62,15 +63,14 @@ def _sig(st):
|
||||||
|
|
||||||
def _do_cmp(f1, f2):
|
def _do_cmp(f1, f2):
|
||||||
bufsize = BUFSIZE
|
bufsize = BUFSIZE
|
||||||
fp1 = open(f1, 'rb')
|
with contextlib.nested(open(f1, 'rb'), open(f2, 'rb')) as (fp1, fp2):
|
||||||
fp2 = open(f2, 'rb')
|
while True:
|
||||||
while True:
|
b1 = fp1.read(bufsize)
|
||||||
b1 = fp1.read(bufsize)
|
b2 = fp2.read(bufsize)
|
||||||
b2 = fp2.read(bufsize)
|
if b1 != b2:
|
||||||
if b1 != b2:
|
return False
|
||||||
return False
|
if not b1:
|
||||||
if not b1:
|
return True
|
||||||
return True
|
|
||||||
|
|
||||||
# Directory comparison class.
|
# Directory comparison class.
|
||||||
#
|
#
|
||||||
|
|
|
@ -61,7 +61,7 @@ PyDoc_STRVAR(lookup__doc__,
|
||||||
"lookup(encoding) -> CodecInfo\n\
|
"lookup(encoding) -> CodecInfo\n\
|
||||||
\n\
|
\n\
|
||||||
Looks up a codec tuple in the Python codec registry and returns\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
|
static
|
||||||
PyObject *codec_lookup(PyObject *self, PyObject *args)
|
PyObject *codec_lookup(PyObject *self, PyObject *args)
|
||||||
|
|
|
@ -458,7 +458,7 @@ tupleindex(PyTupleObject *self, PyObject *args)
|
||||||
else if (cmp < 0)
|
else if (cmp < 0)
|
||||||
return NULL;
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4785,7 +4785,7 @@ slot_nb_bool(PyObject *self)
|
||||||
PyObject *func, *args;
|
PyObject *func, *args;
|
||||||
static PyObject *bool_str, *len_str;
|
static PyObject *bool_str, *len_str;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
int from_len = 0;
|
int using_len = 0;
|
||||||
|
|
||||||
func = lookup_maybe(self, "__bool__", &bool_str);
|
func = lookup_maybe(self, "__bool__", &bool_str);
|
||||||
if (func == NULL) {
|
if (func == NULL) {
|
||||||
|
@ -4794,14 +4794,14 @@ slot_nb_bool(PyObject *self)
|
||||||
func = lookup_maybe(self, "__len__", &len_str);
|
func = lookup_maybe(self, "__len__", &len_str);
|
||||||
if (func == NULL)
|
if (func == NULL)
|
||||||
return PyErr_Occurred() ? -1 : 1;
|
return PyErr_Occurred() ? -1 : 1;
|
||||||
from_len = 1;
|
using_len = 1;
|
||||||
}
|
}
|
||||||
args = PyTuple_New(0);
|
args = PyTuple_New(0);
|
||||||
if (args != NULL) {
|
if (args != NULL) {
|
||||||
PyObject *temp = PyObject_Call(func, args, NULL);
|
PyObject *temp = PyObject_Call(func, args, NULL);
|
||||||
Py_DECREF(args);
|
Py_DECREF(args);
|
||||||
if (temp != NULL) {
|
if (temp != NULL) {
|
||||||
if (from_len) {
|
if (using_len) {
|
||||||
/* enforced by slot_nb_len */
|
/* enforced by slot_nb_len */
|
||||||
result = PyObject_IsTrue(temp);
|
result = PyObject_IsTrue(temp);
|
||||||
}
|
}
|
||||||
|
@ -4810,9 +4810,11 @@ slot_nb_bool(PyObject *self)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"__bool__ should return "
|
"%s should return "
|
||||||
"bool, returned %s",
|
"bool or int, returned %s",
|
||||||
Py_TYPE(temp)->tp_name);
|
(using_len ? "__len__"
|
||||||
|
: "__bool__"),
|
||||||
|
Py_TYPE(temp)->tp_name);
|
||||||
result = -1;
|
result = -1;
|
||||||
}
|
}
|
||||||
Py_DECREF(temp);
|
Py_DECREF(temp);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue