summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/distutils/sourcedist.rst6
-rw-r--r--Doc/library/asyncore.rst3
-rw-r--r--Doc/library/multiprocessing.rst6
-rw-r--r--Doc/library/random.rst12
-rw-r--r--Doc/library/subprocess.rst4
-rw-r--r--Doc/library/sys.rst4
-rw-r--r--Doc/library/xml.dom.minidom.rst22
-rwxr-xr-xLib/mailbox.py12
-rw-r--r--Lib/pipes.py3
-rw-r--r--Lib/test/test_descr.py9
-rw-r--r--Lib/test/test_inspect.py12
-rw-r--r--Lib/test/test_mailbox.py7
-rw-r--r--Lib/test/test_pipes.py2
-rw-r--r--Misc/ACKS1
-rw-r--r--Modules/_cursesmodule.c2
-rw-r--r--Parser/myreadline.c93
16 files changed, 106 insertions, 92 deletions
diff --git a/Doc/distutils/sourcedist.rst b/Doc/distutils/sourcedist.rst
index 150d1e6..57e363b 100644
--- a/Doc/distutils/sourcedist.rst
+++ b/Doc/distutils/sourcedist.rst
@@ -54,9 +54,9 @@ Notes:
requires the :program:`compress` program. Notice that this format is now
pending for deprecation and will be removed in the future versions of Python.
-When using any ``tar`` format (``gztar``, ``bztar``, ``ztar`` or ``tar``), you
-can specify under Unix the ``owner`` and ``group`` names that will be set for
-each member of the archive.
+When using any ``tar`` format (``gztar``, ``bztar``, ``ztar`` or
+``tar``) under Unix, you can specify the ``owner`` and ``group`` names
+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::
diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst
index 60d4d03..e64d51d 100644
--- a/Doc/library/asyncore.rst
+++ b/Doc/library/asyncore.rst
@@ -201,7 +201,8 @@ any that have been added to the map during asynchronous service) is closed.
.. method:: bind(address)
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 :class:`dispatcher` object's :meth:`set_reuse_addr` method.
diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst
index 6d7e768..48b1ccc 100644
--- a/Doc/library/multiprocessing.rst
+++ b/Doc/library/multiprocessing.rst
@@ -1131,7 +1131,7 @@ their parent process exits. The manager classes are defined in the
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.
*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``
then the subprocess will call ``initializer(*initargs)`` when it starts.
- .. method:: serve_forever()
-
- Run the server in the current process.
-
.. method:: get_server()
Returns a :class:`Server` object which represents the actual server under
diff --git a/Doc/library/random.rst b/Doc/library/random.rst
index 54211f4..bf89ade 100644
--- a/Doc/library/random.rst
+++ b/Doc/library/random.rst
@@ -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
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:
diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst
index 3838cc6..13698e7 100644
--- a/Doc/library/subprocess.rst
+++ b/Doc/library/subprocess.rst
@@ -210,7 +210,7 @@ This module also defines four shortcut functions:
Run command with arguments. Wait for command to complete, then return the
: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"])
@@ -229,7 +229,7 @@ This module also defines four shortcut functions:
:exc:`CalledProcessError` object will have the return code in the
: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"])
0
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index c1a0027..6b9377d 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -816,6 +816,10 @@ always available.
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.
+ .. impl-detail::
+ This function is intimately bound to CPython implementation details and
+ thus not likely to be implemented elsewhere.
+
.. data:: stdin
stdout
diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst
index 98e7586..5ece1ca 100644
--- a/Doc/library/xml.dom.minidom.rst
+++ b/Doc/library/xml.dom.minidom.rst
@@ -82,22 +82,12 @@ document: the one that holds all others. Here is an example program::
dom3 = parseString("<myxml>Some data</myxml>")
assert dom3.documentElement.tagName == "myxml"
-When you are finished with a DOM, you should clean it up. This is necessary
-because some versions of Python do not support garbage collection of objects
-that refer to each other in a cycle. Until this restriction is removed from all
-versions of Python, it is safest to write your code as if cycles would not be
-cleaned up.
-
-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.
-
+When you are finished with a DOM tree, you may optionally call the
+:meth:`unlink` method to encourage early cleanup of the now-unneeded
+objects. :meth:`unlink` is a :mod:`xml.dom.minidom`\ -specific
+extension to the DOM API that renders the node and its descendants are
+essentially useless. Otherwise, Python's garbage collector will
+eventually take care of the objects in the tree.
.. seealso::
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index c2c9b5c..e6f1735 100755
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -882,17 +882,9 @@ class MH(Mailbox):
raise KeyError('No message with key: %s' % key)
else:
raise
- try:
- 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:
+ else:
f.close()
+ os.remove(path)
def __setitem__(self, key, message):
"""Replace the keyed message; raise KeyError if it doesn't exist."""
diff --git a/Lib/pipes.py b/Lib/pipes.py
index 6a473ae..deab815 100644
--- a/Lib/pipes.py
+++ b/Lib/pipes.py
@@ -253,10 +253,13 @@ _safechars = string.ascii_letters + string.digits + '!@%_-+=:,./' # Safe unquote
_funnychars = '"`$\\' # Unsafe inside "double quotes"
def quote(file):
+ ''' return a shell-escaped version of the file string '''
for c in file:
if c not in _safechars:
break
else:
+ if not file:
+ return "''"
return file
if '\'' not in file:
return '\'' + file + '\''
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 011cb6d..408f72b 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -4164,6 +4164,15 @@ order (MRO) for bases """
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):
# issue 4230
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 35fd775..1daab64 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -166,12 +166,12 @@ class TestInterpreterStack(IsTestBase):
def test_trace(self):
self.assertEqual(len(git.tr), 3)
- self.assertEqual(revise(*git.tr[0][1:]),
- (modfile, 43, 'argue', [' spam(a, b, c)\n'], 0))
- self.assertEqual(revise(*git.tr[1][1:]),
- (modfile, 9, 'spam', [' eggs(b + d, c + f)\n'], 0))
- self.assertEqual(revise(*git.tr[2][1:]),
- (modfile, 18, 'eggs', [' q = y / 0\n'], 0))
+ self.assertEqual(git.tr[0][1:], (modfile, 43, 'argue',
+ [' spam(a, b, c)\n'], 0))
+ self.assertEqual(git.tr[1][1:], (modfile, 9, 'spam',
+ [' eggs(b + d, c + f)\n'], 0))
+ self.assertEqual(git.tr[2][1:], (modfile, 18, 'eggs',
+ [' q = y / 0\n'], 0))
def test_frame(self):
args, varargs, varkw, locals = inspect.getargvalues(mod.fr)
diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py
index 83f34c7..73ee69f 100644
--- a/Lib/test/test_mailbox.py
+++ b/Lib/test/test_mailbox.py
@@ -968,6 +968,13 @@ class TestMH(TestMailbox):
key0 = self._box.add(msg0)
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):
# Pack the contents of the mailbox
msg0 = mailbox.MHMessage(self._template % 0)
diff --git a/Lib/test/test_pipes.py b/Lib/test/test_pipes.py
index 7b78097..9ce137e 100644
--- a/Lib/test/test_pipes.py
+++ b/Lib/test/test_pipes.py
@@ -82,6 +82,8 @@ class SimplePipeTests(unittest.TestCase):
self.assertEqual(pipes.quote("test%s'name'" % u),
'"test\\%s\'name\'"' % u)
+ self.assertEqual(pipes.quote(''), "''")
+
def testRepr(self):
t = pipes.Template()
self.assertEqual(repr(t), "<Template instance, steps=[]>")
diff --git a/Misc/ACKS b/Misc/ACKS
index ec15267..2f47dbb 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -832,6 +832,7 @@ Blake Winton
Jean-Claude Wippler
Frank Wierzbicki
Lars Wirzenius
+John Wiseman
Chris Withers
Stefan Witzel
Irek Wlizlo
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index a89c22b..708af0a 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -215,7 +215,7 @@ PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
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. */
static int func_PyCursesSetupTermCalled(void)
diff --git a/Parser/myreadline.c b/Parser/myreadline.c
index a144850..0d8394b 100644
--- a/Parser/myreadline.c
+++ b/Parser/myreadline.c
@@ -36,66 +36,63 @@ static int
my_fgets(char *buf, int len, FILE *fp)
{
char *p;
- for (;;) {
- if (PyOS_InputHook != NULL)
- (void)(PyOS_InputHook)();
- errno = 0;
- p = fgets(buf, len, fp);
- if (p != NULL)
- return 0; /* No error */
+ if (PyOS_InputHook != NULL)
+ (void)(PyOS_InputHook)();
+ errno = 0;
+ p = fgets(buf, len, fp);
+ if (p != NULL)
+ return 0; /* No error */
#ifdef MS_WINDOWS
- /* In the case of a Ctrl+C or some other external event
- interrupting the operation:
- Win2k/NT: ERROR_OPERATION_ABORTED is the most recent Win32
- error code (and feof() returns TRUE).
- Win9x: Ctrl+C seems to have no effect on fgets() returning
- early - the signal handler is called, but the fgets()
- only returns "normally" (ie, when Enter hit or feof())
+ /* In the case of a Ctrl+C or some other external event
+ interrupting the operation:
+ Win2k/NT: ERROR_OPERATION_ABORTED is the most recent Win32
+ error code (and feof() returns TRUE).
+ Win9x: Ctrl+C seems to have no effect on fgets() returning
+ early - the signal handler is called, but the fgets()
+ 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) {
- /* 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.
- */
+ 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 */
- }
+ if (feof(fp)) {
+ return -1; /* EOF */
+ }
#ifdef EINTR
- if (errno == EINTR) {
- int s;
+ if (errno == EINTR) {
+ int s;
#ifdef WITH_THREAD
- PyEval_RestoreThread(_PyOS_ReadlineTState);
+ PyEval_RestoreThread(_PyOS_ReadlineTState);
#endif
- s = PyErr_CheckSignals();
+ s = PyErr_CheckSignals();
#ifdef WITH_THREAD
- PyEval_SaveThread();
+ PyEval_SaveThread();
#endif
- if (s < 0) {
- return 1;
- }
+ if (s < 0) {
+ return 1;
}
+ }
#endif
- if (PyOS_InterruptOccurred()) {
- return 1; /* Interrupt */
- }
- return -2; /* Error */
+ if (PyOS_InterruptOccurred()) {
+ return 1; /* Interrupt */
}
- /* NOTREACHED */
+ return -2; /* Error */
}