summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/README.txt18
-rw-r--r--Doc/distutils/setupscript.rst2
-rw-r--r--Doc/extending/extending.rst2
-rw-r--r--Doc/howto/functional.rst2
-rw-r--r--Doc/library/functions.rst92
-rw-r--r--Doc/library/math.rst23
-rw-r--r--Doc/library/multiprocessing.rst18
-rw-r--r--Doc/library/optparse.rst47
-rw-r--r--Doc/library/shutil.rst2
-rw-r--r--Doc/library/signal.rst8
-rw-r--r--Doc/license.rst6
-rw-r--r--Doc/tools/sphinx-web.py14
-rw-r--r--Doc/tools/sphinxext/pyspecific.py6
-rw-r--r--Doc/whatsnew/2.6.rst2
-rw-r--r--LICENSE3
-rw-r--r--Lib/compiler/misc.py4
-rw-r--r--Lib/compiler/pyassem.py6
-rw-r--r--Lib/compiler/symbols.py18
-rw-r--r--Lib/compiler/transformer.py4
-rw-r--r--Lib/compiler/visitor.py2
-rw-r--r--Lib/distutils/ccompiler.py2
-rw-r--r--Lib/lib2to3/main.py3
-rw-r--r--Lib/logging/__init__.py2
-rw-r--r--Lib/test/test_textwrap.py10
-rw-r--r--Lib/test/test_urllib2.py48
-rw-r--r--Lib/textwrap.py14
-rw-r--r--Misc/NEWS18
-rw-r--r--Misc/developers.txt3
-rw-r--r--Modules/gcmodule.c49
-rw-r--r--Modules/mathmodule.c7
-rw-r--r--Objects/object.c3
-rw-r--r--Tools/msi/crtlicense.txt2
32 files changed, 272 insertions, 168 deletions
diff --git a/Doc/README.txt b/Doc/README.txt
index a1ebed7..00f21b8 100644
--- a/Doc/README.txt
+++ b/Doc/README.txt
@@ -74,10 +74,9 @@ Without make
You'll need to checkout the Sphinx package to the `tools/` directory::
- svn co http://svn.python.org/projects/doctools/trunk/sphinx tools/sphinx
+ http://svn.python.org/projects/doctools/trunk/sphinx tools/sphinx
-Then, you need to install Docutils 0.4 (the SVN snapshot won't work), either
-by checking it out via ::
+Then, you need to install Docutils, either by checking it out via ::
svn co http://svn.python.org/projects/external/docutils-0.4/docutils tools/docutils
@@ -94,19 +93,18 @@ Then, make an output directory, e.g. under `build/`, and run ::
python tools/sphinx-build.py -b<builder> . build/<outputdirectory>
-where `<builder>` is one of html, web or htmlhelp (for explanations see the make
-targets above).
+where `<builder>` is one of html, text, latex, or htmlhelp (for explanations see
+the make targets above).
Contributing
============
-For bugs in the content, the online version at http://docs.python.org/ has a
-"suggest change" facility that can be used to correct errors in the source text
-and submit them as a patch to the maintainers.
+Bugs in the content should be reported to the Python bug tracker at
+http://bugs.python.org.
-Bugs in the toolset should be reported in the Python bug tracker at
-http://bugs.python.org/.
+Bugs in the toolset should be reported in the Sphinx bug tracker at
+http://www.bitbucket.org/birkenfeld/sphinx/issues/.
You can also send a mail to the Python Documentation Team at docs@python.org,
and we will process your request as soon as possible.
diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst
index 1e540ed..7971878 100644
--- a/Doc/distutils/setupscript.rst
+++ b/Doc/distutils/setupscript.rst
@@ -563,6 +563,8 @@ This information includes:
+----------------------+---------------------------+-----------------+--------+
| ``classifiers`` | a list of classifiers | list of strings | \(4) |
+----------------------+---------------------------+-----------------+--------+
+| ``platforms`` | a list of platforms | list of strings | |
++----------------------+---------------------------+-----------------+--------+
Notes:
diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst
index ae9e493..8c2268e 100644
--- a/Doc/extending/extending.rst
+++ b/Doc/extending/extending.rst
@@ -865,7 +865,7 @@ memory and should be avoided completely. [#]_
The advantage of borrowing over owning a reference is that you don't need to
take care of disposing of the reference on all possible paths through the code
--- in other words, with a borrowed reference you don't run the risk of leaking
-when a premature exit is taken. The disadvantage of borrowing over leaking is
+when a premature exit is taken. The disadvantage of borrowing over owning is
that there are some subtle situations where in seemingly correct code a borrowed
reference can be used after the owner from which it was borrowed has in fact
disposed of it.
diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst
index 792344d..b717f80 100644
--- a/Doc/howto/functional.rst
+++ b/Doc/howto/functional.rst
@@ -728,7 +728,7 @@ indexes at which certain conditions are met::
if line.strip() == '':
print 'Blank line at line #%i' % i
-``sorted(iterable, [cmp=None], [key=None], [reverse=False)`` collects all the
+``sorted(iterable, [cmp=None], [key=None], [reverse=False])`` collects all the
elements of the iterable into a list, sorts the list, and returns the sorted
result. The ``cmp``, ``key``, and ``reverse`` arguments are passed through to
the constructed list's ``.sort()`` method. ::
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index d6c8d05..9b408dc 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -1363,8 +1363,6 @@ available. They are listed here in alphabetical order.
.. index::
statement: import
- module: ihooks
- module: rexec
module: imp
.. note::
@@ -1372,46 +1370,64 @@ available. They are listed here in alphabetical order.
This is an advanced function that is not needed in everyday Python
programming.
- The function is invoked by the :keyword:`import` statement. It mainly exists
- so that you can replace it with another function that has a compatible
- interface, in order to change the semantics of the :keyword:`import` statement.
- See the built-in module :mod:`imp`, which defines some useful operations out
- of which you can build your own :func:`__import__` function.
-
- For example, the statement ``import spam`` results in the following call:
- ``__import__('spam', globals(), locals(), [], -1)``; the statement
- ``from spam.ham import eggs`` results in ``__import__('spam.ham', globals(),
- locals(), ['eggs'], -1)``. Note that even though ``locals()`` and ``['eggs']``
- are passed in as arguments, the :func:`__import__` function does not set the
- local variable named ``eggs``; this is done by subsequent code that is generated
- for the import statement. (In fact, the standard implementation does not use
- its *locals* argument at all, and uses its *globals* only to determine the
- package context of the :keyword:`import` statement.)
+ This function is invoked by the :keyword:`import` statement. It can be
+ replaced (by importing the :mod:`builtins` module and assigning to
+ ``builtins.__import__``) in order to change semantics of the
+ :keyword:`import` statement, but nowadays it is usually simpler to use import
+ hooks (see :pep:`302`). Direct use of :func:`__import__` is rare, except in
+ cases where you want to import a module whose name is only known at runtime.
+
+ The function imports the module *name*, potentially using the given *globals*
+ and *locals* to determine how to interpret the name in a package context.
+ The *fromlist* gives the names of objects or submodules that should be
+ imported from the module given by *name*. The standard implementation does
+ not use its *locals* argument at all, and uses its *globals* only to
+ determine the package context of the :keyword:`import` statement.
+
+ *level* specifies whether to use absolute or relative imports. The default
+ is ``-1`` which indicates both absolute and relative imports will be
+ attempted. ``0`` means only perform absolute imports. Positive values for
+ *level* indicate the number of parent directories to search relative to the
+ directory of the module calling :func:`__import__`.
When the *name* variable is of the form ``package.module``, normally, the
top-level package (the name up till the first dot) is returned, *not* the
module named by *name*. However, when a non-empty *fromlist* argument is
- given, the module named by *name* is returned. This is done for
- compatibility with the :term:`bytecode` generated for the different kinds of import
- statement; when using ``import spam.ham.eggs``, the top-level package
- :mod:`spam` must be placed in the importing namespace, but when using ``from
- spam.ham import eggs``, the ``spam.ham`` subpackage must be used to find the
- ``eggs`` variable. As a workaround for this behavior, use :func:`getattr` to
- extract the desired components. For example, you could define the following
- helper::
-
- def my_import(name):
- mod = __import__(name)
- components = name.split('.')
- for comp in components[1:]:
- mod = getattr(mod, comp)
- return mod
-
- *level* specifies whether to use absolute or relative imports. The default is
- ``-1`` which indicates both absolute and relative imports will be attempted.
- ``0`` means only perform absolute imports. Positive values for *level* indicate
- the number of parent directories to search relative to the directory of the
- module calling :func:`__import__`.
+ given, the module named by *name* is returned.
+
+ For example, the statement ``import spam`` results in bytecode resembling the
+ following code::
+
+ spam = __import__('spam', globals(), locals(), [], -1)
+
+ The statement ``import spam.ham`` results in this call::
+
+ spam = __import__('spam.ham', globals(), locals(), [], -1)
+
+ Note how :func:`__import__` returns the toplevel module here because this is
+ the object that is bound to a name by the :keyword:`import` statement.
+
+ On the other hand, the statement ``from spam.ham import eggs, sausage as
+ saus`` results in ::
+
+ _temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], -1)
+ eggs = _temp.eggs
+ saus = _temp.sausage
+
+ Here, the ``spam.ham`` module is returned from :func:`__import__`. From this
+ object, the names to import are retrieved and assigned to their respective
+ names.
+
+ If you simply want to import a module (potentially within a package) by name,
+ you can get it from :data:`sys.modules`::
+
+ >>> import sys
+ >>> name = 'foo.bar.baz'
+ >>> __import__(name)
+ <module 'foo' from ...>
+ >>> baz = sys.modules[name]
+ >>> baz
+ <module 'foo.bar.baz' from ...>
.. versionchanged:: 2.5
The level parameter was added.
diff --git a/Doc/library/math.rst b/Doc/library/math.rst
index 3d29736..39fde82 100644
--- a/Doc/library/math.rst
+++ b/Doc/library/math.rst
@@ -21,8 +21,9 @@ was generated in the first place.
The following functions are provided by this module. Except when explicitly
noted otherwise, all return values are floats.
-Number-theoretic and representation functions:
+Number-theoretic and representation functions
+---------------------------------------------
.. function:: ceil(x)
@@ -123,8 +124,8 @@ Number-theoretic and representation functions:
.. function:: modf(x)
- Return the fractional and integer parts of *x*. Both results carry the sign of
- *x*, and both are floats.
+ Return the fractional and integer parts of *x*. Both results carry the sign
+ of *x* and are floats.
.. function:: trunc(x)
@@ -146,7 +147,9 @@ Python floats typically carry no more than 53 bits of precision (the same as the
platform C double type), in which case any float *x* with ``abs(x) >= 2**52``
necessarily has no fractional bits.
-Power and logarithmic functions:
+
+Power and logarithmic functions
+-------------------------------
.. function:: exp(x)
@@ -193,7 +196,8 @@ Power and logarithmic functions:
Return the square root of *x*.
-Trigonometric functions:
+Trigonometric functions
+-----------------------
.. function:: acos(x)
@@ -241,7 +245,8 @@ Trigonometric functions:
Return the tangent of *x* radians.
-Angular conversion:
+Angular conversion
+------------------
.. function:: degrees(x)
@@ -253,7 +258,8 @@ Angular conversion:
Converts angle *x* from degrees to radians.
-Hyperbolic functions:
+Hyperbolic functions
+--------------------
.. function:: acosh(x)
@@ -291,7 +297,8 @@ Hyperbolic functions:
Return the hyperbolic tangent of *x*.
-The module also defines two mathematical constants:
+Constants
+---------
.. data:: pi
diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst
index e1992cc..8297e9f 100644
--- a/Doc/library/multiprocessing.rst
+++ b/Doc/library/multiprocessing.rst
@@ -1438,13 +1438,13 @@ itself. This means, for example, that one shared object can contain a second::
Proxy objects are instances of subclasses of :class:`BaseProxy`.
- .. method:: _call_method(methodname[, args[, kwds]])
+ .. method:: _callmethod(methodname[, args[, kwds]])
Call and return the result of a method of the proxy's referent.
If ``proxy`` is a proxy whose referent is ``obj`` then the expression ::
- proxy._call_method(methodname, args, kwds)
+ proxy._callmethod(methodname, args, kwds)
will evaluate the expression ::
@@ -1457,26 +1457,26 @@ itself. This means, for example, that one shared object can contain a second::
argument of :meth:`BaseManager.register`.
If an exception is raised by the call, then then is re-raised by
- :meth:`_call_method`. If some other exception is raised in the manager's
+ :meth:`_callmethod`. If some other exception is raised in the manager's
process then this is converted into a :exc:`RemoteError` exception and is
- raised by :meth:`_call_method`.
+ raised by :meth:`_callmethod`.
Note in particular that an exception will be raised if *methodname* has
not been *exposed*
- An example of the usage of :meth:`_call_method`::
+ An example of the usage of :meth:`_callmethod`::
>>> l = manager.list(range(10))
- >>> l._call_method('__len__')
+ >>> l._callmethod('__len__')
10
- >>> l._call_method('__getslice__', (2, 7)) # equiv to `l[2:7]`
+ >>> l._callmethod('__getslice__', (2, 7)) # equiv to `l[2:7]`
[2, 3, 4, 5, 6]
- >>> l._call_method('__getitem__', (20,)) # equiv to `l[20]`
+ >>> l._callmethod('__getitem__', (20,)) # equiv to `l[20]`
Traceback (most recent call last):
...
IndexError: list index out of range
- .. method:: _get_value()
+ .. method:: _getvalue()
Return a copy of the referent.
diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst
index 311655d..fbc2de2 100644
--- a/Doc/library/optparse.rst
+++ b/Doc/library/optparse.rst
@@ -1630,36 +1630,33 @@ directly).
Nevertheless, here's a stab at a callback for an option with variable
arguments::
- def vararg_callback(option, opt_str, value, parser):
- assert value is None
- done = 0
- value = []
- rargs = parser.rargs
- while rargs:
- arg = rargs[0]
-
- # Stop if we hit an arg like "--foo", "-a", "-fx", "--file=f",
- # etc. Note that this also stops on "-3" or "-3.0", so if
- # your option takes numeric values, you will need to handle
- # this.
- if ((arg[:2] == "--" and len(arg) > 2) or
- (arg[:1] == "-" and len(arg) > 1 and arg[1] != "-")):
- break
- else:
- value.append(arg)
- del rargs[0]
-
- setattr(parser.values, option.dest, value)
+ def vararg_callback(option, opt_str, value, parser):
+ assert value is None
+ value = []
+
+ def floatable(str):
+ try:
+ float(str)
+ return True
+ except ValueError:
+ return False
+
+ for arg in parser.rargs:
+ # stop on --foo like options
+ if arg[:2] == "--" and len(arg) > 2:
+ break
+ # stop on -a, but not on -3 or -3.0
+ if arg[:1] == "-" and len(arg) > 1 and not floatable(arg):
+ break
+ value.append(arg)
+
+ del parser.rargs[:len(value)]
+ setattr(parser.values, option.dest, value))
[...]
parser.add_option("-c", "--callback", dest="vararg_attr",
action="callback", callback=vararg_callback)
-The main weakness with this particular implementation is that negative numbers
-in the arguments following ``"-c"`` will be interpreted as further options
-(probably causing an error), rather than as arguments to ``"-c"``. Fixing this
-is left as an exercise for the reader.
-
.. _optparse-extending-optparse:
diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst
index b409bb7..7baff30 100644
--- a/Doc/library/shutil.rst
+++ b/Doc/library/shutil.rst
@@ -156,7 +156,7 @@ copying and removal. For operations on individual files, see also the
Recursively move a file or directory to another location.
If the destination is on the current filesystem, then simply use rename.
- Otherwise, copy src to the dst and then remove src.
+ Otherwise, copy src (with :func:`copy2`) to the dst and then remove src.
.. versionadded:: 2.3
diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst
index 74d5ee7..561a1c7 100644
--- a/Doc/library/signal.rst
+++ b/Doc/library/signal.rst
@@ -52,10 +52,10 @@ The variables defined in the :mod:`signal` module are:
.. data:: SIG_DFL
- This is one of two standard signal handling options; it will simply perform the
- default function for the signal. For example, on most systems the default
- action for :const:`SIGQUIT` is to dump core and exit, while the default action
- for :const:`SIGCLD` is to simply ignore it.
+ This is one of two standard signal handling options; it will simply perform
+ the default function for the signal. For example, on most systems the
+ default action for :const:`SIGQUIT` is to dump core and exit, while the
+ default action for :const:`SIGCHLD` is to simply ignore it.
.. data:: SIG_IGN
diff --git a/Doc/license.rst b/Doc/license.rst
index 16f029a..a1742e5 100644
--- a/Doc/license.rst
+++ b/Doc/license.rst
@@ -88,8 +88,14 @@ been GPL-compatible; the table below summarizes the various releases.
+----------------+--------------+-----------+------------+-----------------+
| 2.5.1 | 2.5 | 2007 | PSF | yes |
+----------------+--------------+-----------+------------+-----------------+
+| 2.5.2 | 2.5.1 | 2008 | PSF | yes |
++----------------+--------------+-----------+------------+-----------------+
+| 2.5.3 | 2.5.2 | 2008 | PSF | yes |
++----------------+--------------+-----------+------------+-----------------+
| 2.6 | 2.5 | 2008 | PSF | yes |
+----------------+--------------+-----------+------------+-----------------+
+| 2.6.1 | 2.6 | 2008 | PSF | yes |
++----------------+--------------+-----------+------------+-----------------+
.. note::
diff --git a/Doc/tools/sphinx-web.py b/Doc/tools/sphinx-web.py
deleted file mode 100644
index 5f7b50b..0000000
--- a/Doc/tools/sphinx-web.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- Sphinx - Python documentation webserver
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- :copyright: 2007 by Georg Brandl.
- :license: Python license.
-"""
-
-import sys
-
-if __name__ == '__main__':
- from sphinx.web import main
- sys.exit(main(sys.argv))
diff --git a/Doc/tools/sphinxext/pyspecific.py b/Doc/tools/sphinxext/pyspecific.py
index 00190f2..d389243 100644
--- a/Doc/tools/sphinxext/pyspecific.py
+++ b/Doc/tools/sphinxext/pyspecific.py
@@ -47,7 +47,11 @@ from time import asctime
from pprint import pformat
from docutils.io import StringOutput
from docutils.utils import new_document
-from sphinx.builder import Builder
+
+try:
+ from sphinx.builders import Builder
+except ImportError:
+ from sphinx.builder import Builder
try:
from sphinx.writers.text import TextWriter
diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst
index 96b254c..6d0d422 100644
--- a/Doc/whatsnew/2.6.rst
+++ b/Doc/whatsnew/2.6.rst
@@ -734,7 +734,7 @@ The formatting template uses curly brackets (`{`, `}`) as special characters::
Curly brackets can be escaped by doubling them::
- >>> format("Empty dict: {{}}")
+ >>> "Empty dict: {{}}".format()
"Empty dict: {}"
Field names can be integers indicating positional arguments, such as
diff --git a/LICENSE b/LICENSE
index 3d41e75..69acaeb 100644
--- a/LICENSE
+++ b/LICENSE
@@ -55,7 +55,10 @@ the various releases.
2.4.4 2.4.3 2006 PSF yes
2.5 2.4 2006 PSF yes
2.5.1 2.5 2007 PSF yes
+ 2.5.2 2.5.1 2008 PSF yes
+ 2.5.3 2.5.2 2008 PSF yes
2.6 2.5 2008 PSF yes
+ 2.6.1 2.6 2008 PSF yes
Footnotes:
diff --git a/Lib/compiler/misc.py b/Lib/compiler/misc.py
index 8d91770..588c7fb 100644
--- a/Lib/compiler/misc.py
+++ b/Lib/compiler/misc.py
@@ -14,13 +14,13 @@ class Set:
def __len__(self):
return len(self.elts)
def __contains__(self, elt):
- return self.elts.has_key(elt)
+ return elt in self.elts
def add(self, elt):
self.elts[elt] = elt
def elements(self):
return self.elts.keys()
def has_elt(self, elt):
- return self.elts.has_key(elt)
+ return elt in self.elts
def remove(self, elt):
del self.elts[elt]
def copy(self):
diff --git a/Lib/compiler/pyassem.py b/Lib/compiler/pyassem.py
index 893fa64..6efec28 100644
--- a/Lib/compiler/pyassem.py
+++ b/Lib/compiler/pyassem.py
@@ -210,7 +210,7 @@ def dfs_postorder(b, seen):
order = []
seen[b] = b
for c in b.get_children():
- if seen.has_key(c):
+ if c in seen:
continue
order = order + dfs_postorder(c, seen)
order.append(b)
@@ -406,7 +406,7 @@ class PyFlowGraph(FlowGraph):
seen = {}
def max_depth(b, d):
- if seen.has_key(b):
+ if b in seen:
return d
seen[b] = 1
d = d + depth[b]
@@ -482,7 +482,7 @@ class PyFlowGraph(FlowGraph):
for name in self.cellvars:
cells[name] = 1
self.cellvars = [name for name in self.varnames
- if cells.has_key(name)]
+ if name in cells]
for name in self.cellvars:
del cells[name]
self.cellvars = self.cellvars + cells.keys()
diff --git a/Lib/compiler/symbols.py b/Lib/compiler/symbols.py
index 8f62980..0e660ae 100644
--- a/Lib/compiler/symbols.py
+++ b/Lib/compiler/symbols.py
@@ -49,9 +49,9 @@ class Scope:
def add_global(self, name):
name = self.mangle(name)
- if self.uses.has_key(name) or self.defs.has_key(name):
+ if name in self.uses or name in self.defs:
pass # XXX warn about global following def/use
- if self.params.has_key(name):
+ if name in self.params:
raise SyntaxError, "%s in %s is global and parameter" % \
(name, self.name)
self.globals[name] = 1
@@ -88,14 +88,13 @@ class Scope:
The scope of a name could be LOCAL, GLOBAL, FREE, or CELL.
"""
- if self.globals.has_key(name):
+ if name in self.globals:
return SC_GLOBAL
- if self.cells.has_key(name):
+ if name in self.cells:
return SC_CELL
- if self.defs.has_key(name):
+ if name in self.defs:
return SC_LOCAL
- if self.nested and (self.frees.has_key(name) or
- self.uses.has_key(name)):
+ if self.nested and (name in self.frees or name in self.uses):
return SC_FREE
if self.nested:
return SC_UNKNOWN
@@ -108,8 +107,7 @@ class Scope:
free = {}
free.update(self.frees)
for name in self.uses.keys():
- if not (self.defs.has_key(name) or
- self.globals.has_key(name)):
+ if name not in self.defs and name not in self.globals:
free[name] = 1
return free.keys()
@@ -134,7 +132,7 @@ class Scope:
free.
"""
self.globals[name] = 1
- if self.frees.has_key(name):
+ if name in self.frees:
del self.frees[name]
for child in self.children:
if child.check_name(name) == SC_FREE:
diff --git a/Lib/compiler/transformer.py b/Lib/compiler/transformer.py
index eccade3..f5fe582 100644
--- a/Lib/compiler/transformer.py
+++ b/Lib/compiler/transformer.py
@@ -81,7 +81,7 @@ def extractLineNo(ast):
def Node(*args):
kind = args[0]
- if nodes.has_key(kind):
+ if kind in nodes:
try:
return nodes[kind](*args[1:])
except TypeError:
@@ -120,7 +120,7 @@ class Transformer:
def transform(self, tree):
"""Transform an AST into a modified parse tree."""
if not (isinstance(tree, tuple) or isinstance(tree, list)):
- tree = parser.ast2tuple(tree, line_info=1)
+ tree = parser.st2tuple(tree, line_info=1)
return self.compile_node(tree)
def parsesuite(self, text):
diff --git a/Lib/compiler/visitor.py b/Lib/compiler/visitor.py
index 9e39d36..f10f560 100644
--- a/Lib/compiler/visitor.py
+++ b/Lib/compiler/visitor.py
@@ -84,7 +84,7 @@ class ExampleASTVisitor(ASTVisitor):
meth(node, *args)
elif self.VERBOSE > 0:
klass = node.__class__
- if not self.examples.has_key(klass):
+ if klass not in self.examples:
self.examples[klass] = klass
print
print self.visitor
diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py
index 0ed9a40..87d6e27 100644
--- a/Lib/distutils/ccompiler.py
+++ b/Lib/distutils/ccompiler.py
@@ -1041,7 +1041,7 @@ main (int argc, char **argv) {
return move_file (src, dst, dry_run=self.dry_run)
def mkpath (self, name, mode=0777):
- mkpath (name, mode, self.dry_run)
+ mkpath (name, mode, dry_run=self.dry_run)
# class CCompiler
diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py
index a4d148d..0d65a2e 100644
--- a/Lib/lib2to3/main.py
+++ b/Lib/lib2to3/main.py
@@ -40,7 +40,8 @@ class StdoutRefactoringTool(refactor.RefactoringTool):
# Actually write the new file
super(StdoutRefactoringTool, self).write_file(new_text,
filename, old_text)
- shutil.copymode(filename, backup)
+ if not self.nobackups:
+ shutil.copymode(filename, backup)
def print_output(self, lines):
for line in lines:
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
index 7b790d2..6776500 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -846,7 +846,7 @@ class PlaceHolder:
Add the specified logger as a child of this placeholder.
"""
#if alogger not in self.loggers:
- if not self.loggerMap.has_key(alogger):
+ if alogger not in self.loggerMap:
#self.loggers.append(alogger)
self.loggerMap[alogger] = None
diff --git a/Lib/test/test_textwrap.py b/Lib/test/test_textwrap.py
index 1eab90c..c91e242 100644
--- a/Lib/test/test_textwrap.py
+++ b/Lib/test/test_textwrap.py
@@ -174,7 +174,7 @@ What a mess!
text = ("Python 1.0.0 was released on 1994-01-26. Python 1.0.1 was\n"
"released on 1994-02-15.")
- self.check_wrap(text, 30, ['Python 1.0.0 was released on',
+ self.check_wrap(text, 35, ['Python 1.0.0 was released on',
'1994-01-26. Python 1.0.1 was',
'released on 1994-02-15.'])
self.check_wrap(text, 40, ['Python 1.0.0 was released on 1994-01-26.',
@@ -353,6 +353,14 @@ What a mess!
otext = self.wrapper.fill(text)
assert isinstance(otext, unicode)
+ def test_no_split_at_umlaut(self):
+ text = u"Die Empf\xe4nger-Auswahl"
+ self.check_wrap(text, 13, [u"Die", u"Empf\xe4nger-", u"Auswahl"])
+
+ def test_umlaut_followed_by_dash(self):
+ text = u"aa \xe4\xe4-\xe4\xe4"
+ self.check_wrap(text, 7, [u"aa \xe4\xe4-", u"\xe4\xe4"])
+
def test_split(self):
# Ensure that the standard _split() method works as advertised
# in the comments
diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py
index e28ee71..ff164c2 100644
--- a/Lib/test/test_urllib2.py
+++ b/Lib/test/test_urllib2.py
@@ -1104,6 +1104,51 @@ class MiscTests(unittest.TestCase):
else:
self.assert_(False)
+class RequestTests(unittest.TestCase):
+
+ def setUp(self):
+ self.get = urllib2.Request("http://www.python.org/~jeremy/")
+ self.post = urllib2.Request("http://www.python.org/~jeremy/",
+ "data",
+ headers={"X-Test": "test"})
+
+ def test_method(self):
+ self.assertEqual("POST", self.post.get_method())
+ self.assertEqual("GET", self.get.get_method())
+
+ def test_add_data(self):
+ self.assert_(not self.get.has_data())
+ self.assertEqual("GET", self.get.get_method())
+ self.get.add_data("spam")
+ self.assert_(self.get.has_data())
+ self.assertEqual("POST", self.get.get_method())
+
+ def test_get_full_url(self):
+ self.assertEqual("http://www.python.org/~jeremy/",
+ self.get.get_full_url())
+
+ def test_selector(self):
+ self.assertEqual("/~jeremy/", self.get.get_selector())
+ req = urllib2.Request("http://www.python.org/")
+ self.assertEqual("/", req.get_selector())
+
+ def test_get_type(self):
+ self.assertEqual("http", self.get.get_type())
+
+ def test_get_host(self):
+ self.assertEqual("www.python.org", self.get.get_host())
+
+ def test_get_host_unquote(self):
+ req = urllib2.Request("http://www.%70ython.org/")
+ self.assertEqual("www.python.org", req.get_host())
+
+ def test_proxy(self):
+ self.assert_(not self.get.has_proxy())
+ self.get.set_proxy("www.perl.org", "http")
+ self.assert_(self.get.has_proxy())
+ self.assertEqual("www.python.org", self.get.get_origin_req_host())
+ self.assertEqual("www.perl.org", self.get.get_host())
+
def test_main(verbose=None):
from test import test_urllib2
@@ -1112,7 +1157,8 @@ def test_main(verbose=None):
tests = (TrivialTests,
OpenerDirectorTests,
HandlerTests,
- MiscTests)
+ MiscTests,
+ RequestTests)
test_support.run_unittest(*tests)
if __name__ == "__main__":
diff --git a/Lib/textwrap.py b/Lib/textwrap.py
index 53f2f1b..192b43b 100644
--- a/Lib/textwrap.py
+++ b/Lib/textwrap.py
@@ -84,16 +84,16 @@ class TextWrapper:
# splits into
# Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option!
# (after stripping out empty strings).
- wordsep_re = re.compile(
+ wordsep_re = (
r'(\s+|' # any whitespace
- r'[^\s\w]*\w+[a-zA-Z]-(?=\w+[a-zA-Z])|' # hyphenated words
+ r'[^\s\w]*\w+[^0-9\W]-(?=\w+[^0-9\W])|' # hyphenated words
r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') # em-dash
# This less funky little regex just split on recognized spaces. E.g.
# "Hello there -- you goof-ball, use the -b option!"
# splits into
# Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/
- wordsep_simple_re = re.compile(r'(\s+)')
+ wordsep_simple_re = r'(\s+)'
# XXX this is not locale- or charset-aware -- string.lowercase
# is US-ASCII only (and therefore English-only)
@@ -160,10 +160,12 @@ class TextWrapper:
'use', ' ', 'the', ' ', '-b', ' ', option!'
otherwise.
"""
- if self.break_on_hyphens is True:
- chunks = self.wordsep_re.split(text)
+ flags = re.UNICODE if isinstance(text, unicode) else 0
+ if self.break_on_hyphens:
+ pat = self.wordsep_re
else:
- chunks = self.wordsep_simple_re.split(text)
+ pat = self.wordsep_simple_re
+ chunks = re.compile(pat, flags).split(text)
chunks = filter(None, chunks) # remove empty chunks
return chunks
diff --git a/Misc/NEWS b/Misc/NEWS
index 43f5ce7..4eba4f6 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,10 @@ Core and Builtins
- Issue #4597: Fixed several opcodes that weren't always propagating
exceptions.
+- Issue #2467: gc.DEBUG_STATS reported invalid elapsed times. Also, always
+ print elapsed times, not only when some objects are uncollectable /
+ unreachable. Original patch by Neil Schemenauer.
+
- Issue #4589: Fixed exception handling when the __exit__ function of a
context manager returns a value that cannot be converted to a bool.
@@ -114,10 +118,21 @@ Core and Builtins
Library
-------
+- Issue #4163: Use unicode-friendly word splitting in the textwrap functions
+ when given an unicode string.
+
+- Issue #4616: TarFile.utime(): Restore directory times on Windows.
+
- Issue #4084: Fix max, min, max_mag and min_mag Decimal methods to
give correct results in the case where one argument is a quiet NaN
and the other is a finite number that requires rounding.
+- Issue #1030250: Distutils created directories even when run with the
+ --dry-run option.
+
+- Issue #4483: _dbm module now builds on systems with gdbm & gdbm_compat
+ libs.
+
- Issue #4529: fix the parser module's validation of try-except-finally
statements.
@@ -177,6 +192,9 @@ Build
C-API
-----
+- Issue #3632: from the gdb debugger, the 'pyo' macro can now be called when
+ the GIL is released, or owned by another thread.
+
- Issue #4122: On Windows, fix a compilation error when using the
Py_UNICODE_ISSPACE macro in an extension module.
diff --git a/Misc/developers.txt b/Misc/developers.txt
index 8832463..b4f6c70 100644
--- a/Misc/developers.txt
+++ b/Misc/developers.txt
@@ -17,6 +17,9 @@ the format to accommodate documentation needs as they arise.
Permissions History
-------------------
+- Tarek Ziadé as given SVN access on Decmeber 21 2008 by NCN,
+ for maintenance of distutils.
+
- Hirokazu Yamamoto was given SVN access on August 12 2008 by MvL,
for contributions to the Windows build.
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 6f12972..c7426a5 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -740,6 +740,24 @@ clear_freelists(void)
(void)PyFloat_ClearFreeList();
}
+static double
+get_time(void)
+{
+ double result = 0;
+ if (tmod != NULL) {
+ PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
+ if (f == NULL) {
+ PyErr_Clear();
+ }
+ else {
+ if (PyFloat_Check(f))
+ result = PyFloat_AsDouble(f);
+ Py_DECREF(f);
+ }
+ }
+ return result;
+}
+
/* This is the main function. Read this to understand how the
* collection process works. */
static Py_ssize_t
@@ -762,16 +780,7 @@ collect(int generation)
}
if (debug & DEBUG_STATS) {
- if (tmod != NULL) {
- PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
- if (f == NULL) {
- PyErr_Clear();
- }
- else {
- t1 = PyFloat_AsDouble(f);
- Py_DECREF(f);
- }
- }
+ t1 = get_time();
PySys_WriteStderr("gc: collecting generation %d...\n",
generation);
PySys_WriteStderr("gc: objects in each generation:");
@@ -844,17 +853,6 @@ collect(int generation)
if (debug & DEBUG_COLLECTABLE) {
debug_cycle("collectable", FROM_GC(gc));
}
- if (tmod != NULL && (debug & DEBUG_STATS)) {
- PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
- if (f == NULL) {
- PyErr_Clear();
- }
- else {
- t1 = PyFloat_AsDouble(f)-t1;
- Py_DECREF(f);
- PySys_WriteStderr("gc: %.4fs elapsed.\n", t1);
- }
- }
}
/* Clear weakrefs and invoke callbacks as necessary. */
@@ -876,14 +874,19 @@ collect(int generation)
debug_cycle("uncollectable", FROM_GC(gc));
}
if (debug & DEBUG_STATS) {
+ double t2 = get_time();
if (m == 0 && n == 0)
- PySys_WriteStderr("gc: done.\n");
+ PySys_WriteStderr("gc: done");
else
PySys_WriteStderr(
"gc: done, "
"%" PY_FORMAT_SIZE_T "d unreachable, "
- "%" PY_FORMAT_SIZE_T "d uncollectable.\n",
+ "%" PY_FORMAT_SIZE_T "d uncollectable",
n+m, n);
+ if (t1 && t2) {
+ PySys_WriteStderr(", %.4fs elapsed", t2-t1);
+ }
+ PySys_WriteStderr(".\n");
}
/* Append instances in the uncollectable set to a Python
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 5087ecc..952d56a 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -630,7 +630,10 @@ error:
return NULL;
}
-PyDoc_STRVAR(math_factorial_doc, "Return n!");
+PyDoc_STRVAR(math_factorial_doc,
+"factorial(x) -> Integral\n"
+"\n"
+"Find x!. Raise a ValueError if x is negative or non-integral.");
static PyObject *
math_trunc(PyObject *self, PyObject *number)
@@ -764,7 +767,7 @@ PyDoc_STRVAR(math_modf_doc,
"modf(x)\n"
"\n"
"Return the fractional and integer parts of x. Both results carry the sign\n"
-"of x. The integer part is returned as a real.");
+"of x and are floats.");
/* A decent logarithm is easy to compute even for huge longs, but libm can't
do that by itself -- loghelper can. func is log or log10, and name is
diff --git a/Objects/object.c b/Objects/object.c
index 9cd34b8..c882cf2 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -331,8 +331,11 @@ void _PyObject_Dump(PyObject* op)
if (op == NULL)
fprintf(stderr, "NULL\n");
else {
+ PyGILState_STATE gil;
fprintf(stderr, "object : ");
+ gil = PyGILState_Ensure();
(void)PyObject_Print(op, stderr, 0);
+ PyGILState_Release(gil);
/* XXX(twouters) cast refcount to long until %zd is
universally available */
fprintf(stderr, "\n"
diff --git a/Tools/msi/crtlicense.txt b/Tools/msi/crtlicense.txt
index 8ecd499..936bc5a 100644
--- a/Tools/msi/crtlicense.txt
+++ b/Tools/msi/crtlicense.txt
@@ -26,7 +26,7 @@ complies with this agreement, provided that you do not:
- alter any copyright, trademark or patent notice in Microsoft's
Distributable Code;
-- use Microsoft’s trademarks in your programs’ names or in a way that
+- use Microsoft's trademarks in your programs' names or in a way that
suggests your programs come from or are endorsed by Microsoft;
- distribute Microsoft's Distributable Code to run on a platform other