Merged revisions 77952,78030,78102,78104,78107,78206,78216,78296-78297,78328,78331-78332,78336,78339,78343,78378-78379,78415,78559,78717,78791 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r77952 | mark.dickinson | 2010-02-03 10:50:14 -0600 (Wed, 03 Feb 2010) | 1 line

  Fix test_inspect.py data to match recent change to inspect_fodder.py (r77942).
........
  r78030 | benjamin.peterson | 2010-02-06 14:14:10 -0600 (Sat, 06 Feb 2010) | 1 line

  check type_getattro for correctness in a descriptor corner case
........
  r78102 | andrew.kuchling | 2010-02-07 19:35:35 -0600 (Sun, 07 Feb 2010) | 1 line

  Move distutils into its own subsection; add various items
........
  r78104 | andrew.kuchling | 2010-02-08 07:22:24 -0600 (Mon, 08 Feb 2010) | 1 line

  Add two items; move a subsection
........
  r78107 | antoine.pitrou | 2010-02-08 14:25:47 -0600 (Mon, 08 Feb 2010) | 3 lines

  Clarify and correct description for ccbench and iobench.
........
  r78206 | r.david.murray | 2010-02-16 11:55:26 -0600 (Tue, 16 Feb 2010) | 3 lines

  Make the references to Popen in the description of Call
  and check_call into links.
........
  r78216 | andrew.kuchling | 2010-02-18 08:16:48 -0600 (Thu, 18 Feb 2010) | 1 line

  Add various items
........
  r78296 | andrew.kuchling | 2010-02-21 20:08:45 -0600 (Sun, 21 Feb 2010) | 1 line

  Re-word
........
  r78297 | andrew.kuchling | 2010-02-21 20:29:10 -0600 (Sun, 21 Feb 2010) | 1 line

  #7076: mention SystemRandom class near start of the module docs; reword change description for clarity.  Noted by Shawn Ligocki.
........
  r78328 | jack.diederich | 2010-02-22 12:17:16 -0600 (Mon, 22 Feb 2010) | 1 line

  fixes issue #7530, serve_forever()
........
  r78331 | andrew.kuchling | 2010-02-22 12:38:23 -0600 (Mon, 22 Feb 2010) | 1 line

  Fix comment typo
........
  r78332 | andrew.kuchling | 2010-02-22 12:42:07 -0600 (Mon, 22 Feb 2010) | 2 lines

  #7627: MH.remove() would fail if the MH mailbox was locked;
  it would call _unlock_file() and pass it a closed file object.  Noted by Rob Austein.
........
  r78336 | jack.diederich | 2010-02-22 13:55:22 -0600 (Mon, 22 Feb 2010) | 1 line

  fixes issue #1522237, bad init check in _threading_local
........
  r78339 | jack.diederich | 2010-02-22 15:27:38 -0600 (Mon, 22 Feb 2010) | 1 line

  * fix issue#7476
........
  r78343 | andrew.kuchling | 2010-02-22 16:48:41 -0600 (Mon, 22 Feb 2010) | 10 lines

  #2560: remove an unnecessary 'for' loop from my_fgets() in Parser/myreadline.c.
  Noted by Joseph Armbruster; patch by Jessica McKellar.

  The original code was 'for (;;) {...}', where ... ended
  with a 'return -2' statement and did not contain a 'break' or 'continue'
  statement.  Therefore, the body of the loop is always executed once.

  Once upon a time there was a 'continue' in the loop, but it was removed in
  rev36346, committed by mwh on Wed Jul 7 17:44:12 2004.
........
  r78378 | jack.diederich | 2010-02-23 11:23:30 -0600 (Tue, 23 Feb 2010) | 1 line

  fixup markup error
........
  r78379 | jack.diederich | 2010-02-23 13:34:06 -0600 (Tue, 23 Feb 2010) | 1 line

   issue#6442 use in operator instead of has_key
........
  r78415 | dirkjan.ochtman | 2010-02-23 22:00:52 -0600 (Tue, 23 Feb 2010) | 1 line

  Issue #7733: add explicit reference in asyncore docs.
........
  r78559 | andrew.kuchling | 2010-03-01 13:45:21 -0600 (Mon, 01 Mar 2010) | 1 line

  #7637: update discussion of minidom.unlink() and garbage collection
........
  r78717 | benjamin.peterson | 2010-03-05 21:13:33 -0600 (Fri, 05 Mar 2010) | 1 line

  settscdump is definitely an implementation detail
........
  r78791 | andrew.kuchling | 2010-03-08 06:00:39 -0600 (Mon, 08 Mar 2010) | 1 line

  Add various items
........
This commit is contained in:
Benjamin Peterson 2010-03-21 22:03:03 +00:00
parent 7588b8b355
commit 21896a330a
16 changed files with 112 additions and 98 deletions

View File

@ -54,9 +54,9 @@ Notes:
requires the :program:`compress` program. Notice that this format is now requires the :program:`compress` program. Notice that this format is now
pending for deprecation and will be removed in the future versions of Python. pending for deprecation and will be removed in the future versions of Python.
When using any ``tar`` format (``gztar``, ``bztar``, ``ztar`` or ``tar``), you When using any ``tar`` format (``gztar``, ``bztar``, ``ztar`` or
can specify under Unix the ``owner`` and ``group`` names that will be set for ``tar``) under Unix, you can specify the ``owner`` and ``group`` names
each member of the archive. that will be set for each member of the archive.
For example, if you want all files of the archive to be owned by root:: For example, if you want all files of the archive to be owned by root::

View File

@ -201,7 +201,8 @@ any that have been added to the map during asynchronous service) is closed.
.. method:: bind(address) .. method:: bind(address)
Bind the socket to *address*. The socket must not already be bound. (The Bind the socket to *address*. The socket must not already be bound. (The
format of *address* depends on the address family --- see above.) To mark format of *address* depends on the address family --- refer to the
:mod:`socket` documentation for more information.) To mark
the socket as re-usable (setting the :const:`SO_REUSEADDR` option), call the socket as re-usable (setting the :const:`SO_REUSEADDR` option), call
the :class:`dispatcher` object's :meth:`set_reuse_addr` method. the :class:`dispatcher` object's :meth:`set_reuse_addr` method.

View File

@ -1131,7 +1131,7 @@ their parent process exits. The manager classes are defined in the
Create a BaseManager object. Create a BaseManager object.
Once created one should call :meth:`start` or :meth:`serve_forever` to ensure Once created one should call :meth:`start` or ``get_server().serve_forever()`` to ensure
that the manager object refers to a started manager process. that the manager object refers to a started manager process.
*address* is the address on which the manager process listens for new *address* is the address on which the manager process listens for new
@ -1147,10 +1147,6 @@ their parent process exits. The manager classes are defined in the
Start a subprocess to start the manager. If *initializer* is not ``None`` Start a subprocess to start the manager. If *initializer* is not ``None``
then the subprocess will call ``initializer(*initargs)`` when it starts. then the subprocess will call ``initializer(*initargs)`` when it starts.
.. method:: serve_forever()
Run the server in the current process.
.. method:: get_server() .. method:: get_server()
Returns a :class:`Server` object which represents the actual server under Returns a :class:`Server` object which represents the actual server under

View File

@ -35,6 +35,18 @@ basic generator of your own devising: in that case, override the :meth:`random`,
Optionally, a new generator can supply a :meth:`getrandbits` method --- this Optionally, a new generator can supply a :meth:`getrandbits` method --- this
allows :meth:`randrange` to produce selections over an arbitrarily large range. allows :meth:`randrange` to produce selections over an arbitrarily large range.
As an example of subclassing, the :mod:`random` module provides the
:class:`WichmannHill` class that implements an alternative generator in pure
Python. The class provides a backward compatible way to reproduce results from
earlier versions of Python, which used the Wichmann-Hill algorithm as the core
generator. Note that this Wichmann-Hill generator can no longer be recommended:
its period is too short by contemporary standards, and the sequence generated is
known to fail some stringent randomness tests. See the references below for a
recent variant that repairs these flaws.
The :mod:`random` module also provides the :class:`SystemRandom` class which
uses the system function :func:`os.urandom` to generate random numbers
from sources provided by the operating system.
Bookkeeping functions: Bookkeeping functions:

View File

@ -210,7 +210,7 @@ This module also defines four shortcut functions:
Run command with arguments. Wait for command to complete, then return the Run command with arguments. Wait for command to complete, then return the
:attr:`returncode` attribute. :attr:`returncode` attribute.
The arguments are the same as for the Popen constructor. Example:: The arguments are the same as for the :class:`Popen` constructor. Example::
>>> retcode = subprocess.call(["ls", "-l"]) >>> retcode = subprocess.call(["ls", "-l"])
@ -229,7 +229,7 @@ This module also defines four shortcut functions:
:exc:`CalledProcessError` object will have the return code in the :exc:`CalledProcessError` object will have the return code in the
:attr:`returncode` attribute. :attr:`returncode` attribute.
The arguments are the same as for the Popen constructor. Example:: The arguments are the same as for the :class:`Popen` constructor. Example::
>>> subprocess.check_call(["ls", "-l"]) >>> subprocess.check_call(["ls", "-l"])
0 0

View File

@ -816,6 +816,10 @@ always available.
available only if Python was compiled with :option:`--with-tsc`. To understand available only if Python was compiled with :option:`--with-tsc`. To understand
the output of this dump, read :file:`Python/ceval.c` in the Python sources. the output of this dump, read :file:`Python/ceval.c` in the Python sources.
.. impl-detail::
This function is intimately bound to CPython implementation details and
thus not likely to be implemented elsewhere.
.. data:: stdin .. data:: stdin
stdout stdout

View File

@ -82,22 +82,12 @@ document: the one that holds all others. Here is an example program::
dom3 = parseString("<myxml>Some data</myxml>") dom3 = parseString("<myxml>Some data</myxml>")
assert dom3.documentElement.tagName == "myxml" assert dom3.documentElement.tagName == "myxml"
When you are finished with a DOM, you should clean it up. This is necessary When you are finished with a DOM tree, you may optionally call the
because some versions of Python do not support garbage collection of objects :meth:`unlink` method to encourage early cleanup of the now-unneeded
that refer to each other in a cycle. Until this restriction is removed from all objects. :meth:`unlink` is a :mod:`xml.dom.minidom`\ -specific
versions of Python, it is safest to write your code as if cycles would not be extension to the DOM API that renders the node and its descendants are
cleaned up. essentially useless. Otherwise, Python's garbage collector will
eventually take care of the objects in the tree.
The way to clean up a DOM is to call its :meth:`unlink` method::
dom1.unlink()
dom2.unlink()
dom3.unlink()
:meth:`unlink` is a :mod:`xml.dom.minidom`\ -specific extension to the DOM API.
After calling :meth:`unlink` on a node, the node and its descendants are
essentially useless.
.. seealso:: .. seealso::

View File

@ -882,17 +882,9 @@ class MH(Mailbox):
raise KeyError('No message with key: %s' % key) raise KeyError('No message with key: %s' % key)
else: else:
raise raise
try: else:
if self._locked:
_lock_file(f)
try:
f.close()
os.remove(os.path.join(self._path, str(key)))
finally:
if self._locked:
_unlock_file(f)
finally:
f.close() f.close()
os.remove(path)
def __setitem__(self, key, message): def __setitem__(self, key, message):
"""Replace the keyed message; raise KeyError if it doesn't exist.""" """Replace the keyed message; raise KeyError if it doesn't exist."""

View File

@ -253,10 +253,13 @@ _safechars = string.ascii_letters + string.digits + '!@%_-+=:,./' # Safe unquote
_funnychars = '"`$\\' # Unsafe inside "double quotes" _funnychars = '"`$\\' # Unsafe inside "double quotes"
def quote(file): def quote(file):
''' return a shell-escaped version of the file string '''
for c in file: for c in file:
if c not in _safechars: if c not in _safechars:
break break
else: else:
if not file:
return "''"
return file return file
if '\'' not in file: if '\'' not in file:
return '\'' + file + '\'' return '\'' + file + '\''

View File

@ -4164,6 +4164,15 @@ order (MRO) for bases """
x.a = 42 x.a = 42
self.assertEqual(x.a, 42) self.assertEqual(x.a, 42)
# Also check type_getattro for correctness.
class Meta(type):
pass
class X(object):
__metaclass__ = Meta
X.a = 42
Meta.a = Descr("a")
self.assertEqual(X.a, 42)
def test_getattr_hooks(self): def test_getattr_hooks(self):
# issue 4230 # issue 4230

View File

@ -166,12 +166,12 @@ class TestInterpreterStack(IsTestBase):
def test_trace(self): def test_trace(self):
self.assertEqual(len(git.tr), 3) self.assertEqual(len(git.tr), 3)
self.assertEqual(revise(*git.tr[0][1:]), self.assertEqual(git.tr[0][1:], (modfile, 43, 'argue',
(modfile, 43, 'argue', [' spam(a, b, c)\n'], 0)) [' spam(a, b, c)\n'], 0))
self.assertEqual(revise(*git.tr[1][1:]), self.assertEqual(git.tr[1][1:], (modfile, 9, 'spam',
(modfile, 9, 'spam', [' eggs(b + d, c + f)\n'], 0)) [' eggs(b + d, c + f)\n'], 0))
self.assertEqual(revise(*git.tr[2][1:]), self.assertEqual(git.tr[2][1:], (modfile, 18, 'eggs',
(modfile, 18, 'eggs', [' q = y / 0\n'], 0)) [' q = y / 0\n'], 0))
def test_frame(self): def test_frame(self):
args, varargs, varkw, locals = inspect.getargvalues(mod.fr) args, varargs, varkw, locals = inspect.getargvalues(mod.fr)

View File

@ -968,6 +968,13 @@ class TestMH(TestMailbox):
key0 = self._box.add(msg0) key0 = self._box.add(msg0)
refmsg0 = self._box.get_message(key0) refmsg0 = self._box.get_message(key0)
def test_issue7627(self):
msg0 = mailbox.MHMessage(self._template % 0)
key0 = self._box.add(msg0)
self._box.lock()
self._box.remove(key0)
self._box.unlock()
def test_pack(self): def test_pack(self):
# Pack the contents of the mailbox # Pack the contents of the mailbox
msg0 = mailbox.MHMessage(self._template % 0) msg0 = mailbox.MHMessage(self._template % 0)

View File

@ -82,6 +82,8 @@ class SimplePipeTests(unittest.TestCase):
self.assertEqual(pipes.quote("test%s'name'" % u), self.assertEqual(pipes.quote("test%s'name'" % u),
'"test\\%s\'name\'"' % u) '"test\\%s\'name\'"' % u)
self.assertEqual(pipes.quote(''), "''")
def testRepr(self): def testRepr(self):
t = pipes.Template() t = pipes.Template()
self.assertEqual(repr(t), "<Template instance, steps=[]>") self.assertEqual(repr(t), "<Template instance, steps=[]>")

View File

@ -832,6 +832,7 @@ Blake Winton
Jean-Claude Wippler Jean-Claude Wippler
Frank Wierzbicki Frank Wierzbicki
Lars Wirzenius Lars Wirzenius
John Wiseman
Chris Withers Chris Withers
Stefan Witzel Stefan Witzel
Irek Wlizlo Irek Wlizlo

View File

@ -215,7 +215,7 @@ PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
return 1; return 1;
} }
/* Function versions of the 3 functions for tested whether curses has been /* Function versions of the 3 functions for testing whether curses has been
initialised or not. */ initialised or not. */
static int func_PyCursesSetupTermCalled(void) static int func_PyCursesSetupTermCalled(void)

View File

@ -36,66 +36,63 @@ static int
my_fgets(char *buf, int len, FILE *fp) my_fgets(char *buf, int len, FILE *fp)
{ {
char *p; char *p;
for (;;) { if (PyOS_InputHook != NULL)
if (PyOS_InputHook != NULL) (void)(PyOS_InputHook)();
(void)(PyOS_InputHook)(); errno = 0;
errno = 0; p = fgets(buf, len, fp);
p = fgets(buf, len, fp); if (p != NULL)
if (p != NULL) return 0; /* No error */
return 0; /* No error */
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
/* In the case of a Ctrl+C or some other external event /* In the case of a Ctrl+C or some other external event
interrupting the operation: interrupting the operation:
Win2k/NT: ERROR_OPERATION_ABORTED is the most recent Win32 Win2k/NT: ERROR_OPERATION_ABORTED is the most recent Win32
error code (and feof() returns TRUE). error code (and feof() returns TRUE).
Win9x: Ctrl+C seems to have no effect on fgets() returning Win9x: Ctrl+C seems to have no effect on fgets() returning
early - the signal handler is called, but the fgets() early - the signal handler is called, but the fgets()
only returns "normally" (ie, when Enter hit or feof()) only returns "normally" (ie, when Enter hit or feof())
*/
if (GetLastError()==ERROR_OPERATION_ABORTED) {
/* Signals come asynchronously, so we sleep a brief
moment before checking if the handler has been
triggered (we cant just return 1 before the
signal handler has been called, as the later
signal may be treated as a separate interrupt).
*/ */
if (GetLastError()==ERROR_OPERATION_ABORTED) { Sleep(1);
/* Signals come asynchronously, so we sleep a brief
moment before checking if the handler has been
triggered (we cant just return 1 before the
signal handler has been called, as the later
signal may be treated as a separate interrupt).
*/
Sleep(1);
if (PyOS_InterruptOccurred()) {
return 1; /* Interrupt */
}
/* Either the sleep wasn't long enough (need a
short loop retrying?) or not interrupted at all
(in which case we should revisit the whole thing!)
Logging some warning would be nice. assert is not
viable as under the debugger, the various dialogs
mean the condition is not true.
*/
}
#endif /* MS_WINDOWS */
if (feof(fp)) {
return -1; /* EOF */
}
#ifdef EINTR
if (errno == EINTR) {
int s;
#ifdef WITH_THREAD
PyEval_RestoreThread(_PyOS_ReadlineTState);
#endif
s = PyErr_CheckSignals();
#ifdef WITH_THREAD
PyEval_SaveThread();
#endif
if (s < 0) {
return 1;
}
}
#endif
if (PyOS_InterruptOccurred()) { if (PyOS_InterruptOccurred()) {
return 1; /* Interrupt */ return 1; /* Interrupt */
} }
return -2; /* Error */ /* Either the sleep wasn't long enough (need a
short loop retrying?) or not interrupted at all
(in which case we should revisit the whole thing!)
Logging some warning would be nice. assert is not
viable as under the debugger, the various dialogs
mean the condition is not true.
*/
} }
/* NOTREACHED */ #endif /* MS_WINDOWS */
if (feof(fp)) {
return -1; /* EOF */
}
#ifdef EINTR
if (errno == EINTR) {
int s;
#ifdef WITH_THREAD
PyEval_RestoreThread(_PyOS_ReadlineTState);
#endif
s = PyErr_CheckSignals();
#ifdef WITH_THREAD
PyEval_SaveThread();
#endif
if (s < 0) {
return 1;
}
}
#endif
if (PyOS_InterruptOccurred()) {
return 1; /* Interrupt */
}
return -2; /* Error */
} }