Merged revisions 67654,67676-67677,67681,67692,67725,67746,67748,67761,67784-67785,67787-67788,67802,67832,67848-67849,67859,67862-67864,67880,67882,67885,67889-67892,67895 via svnmerge from

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

................
  r67654 | georg.brandl | 2008-12-07 16:42:09 -0600 (Sun, 07 Dec 2008) | 2 lines

  #4457: rewrite __import__() documentation.
................
  r67676 | benjamin.peterson | 2008-12-08 20:03:03 -0600 (Mon, 08 Dec 2008) | 1 line

  specify how things are copied
................
  r67677 | benjamin.peterson | 2008-12-08 20:05:11 -0600 (Mon, 08 Dec 2008) | 1 line

  revert unrelated change to installer script
................
  r67681 | jeremy.hylton | 2008-12-09 15:03:10 -0600 (Tue, 09 Dec 2008) | 2 lines

  Add simple unittests for Request
................
  r67692 | amaury.forgeotdarc | 2008-12-10 18:03:42 -0600 (Wed, 10 Dec 2008) | 2 lines

  #1030250: correctly pass the dry_run option to the mkpath() function.
................
  r67725 | benjamin.peterson | 2008-12-12 22:02:20 -0600 (Fri, 12 Dec 2008) | 1 line

  fix incorrect example
................
  r67746 | antoine.pitrou | 2008-12-13 17:12:30 -0600 (Sat, 13 Dec 2008) | 3 lines

  Issue #4163: Use unicode-friendly word splitting in the textwrap functions when given an unicode string.
................
  r67748 | benjamin.peterson | 2008-12-13 19:46:11 -0600 (Sat, 13 Dec 2008) | 1 line

  remove has_key usage
................
  r67761 | benjamin.peterson | 2008-12-14 11:26:04 -0600 (Sun, 14 Dec 2008) | 1 line

  fix missing bracket
................
  r67784 | georg.brandl | 2008-12-15 02:33:58 -0600 (Mon, 15 Dec 2008) | 2 lines

  #4446: document "platforms" argument for setup().
................
  r67785 | georg.brandl | 2008-12-15 02:36:11 -0600 (Mon, 15 Dec 2008) | 2 lines

  #4611: fix typo.
................
  r67787 | georg.brandl | 2008-12-15 02:58:59 -0600 (Mon, 15 Dec 2008) | 2 lines

  #4578: fix has_key() usage in compiler package.
................
  r67788 | georg.brandl | 2008-12-15 03:07:39 -0600 (Mon, 15 Dec 2008) | 2 lines

  #4568: remove limitation in varargs callback example.
................
  r67802 | amaury.forgeotdarc | 2008-12-15 16:29:14 -0600 (Mon, 15 Dec 2008) | 4 lines

  #3632: the "pyo" macro from gdbinit can now run when the GIL is released.

  Patch by haypo.
................
  r67832 | antoine.pitrou | 2008-12-17 16:46:54 -0600 (Wed, 17 Dec 2008) | 4 lines

  Issue #2467: gc.DEBUG_STATS reports invalid elapsed times.
  Patch by Neil Schemenauer, very slightly modified.
................
  r67848 | benjamin.peterson | 2008-12-18 20:28:56 -0600 (Thu, 18 Dec 2008) | 1 line

  fix typo
................
  r67849 | benjamin.peterson | 2008-12-18 20:31:35 -0600 (Thu, 18 Dec 2008) | 1 line

  _call_method -> _callmethod and _get_value to _getvalue
................
  r67859 | amaury.forgeotdarc | 2008-12-19 16:56:48 -0600 (Fri, 19 Dec 2008) | 4 lines

  #4700: crtlicense.txt is displayed by the license() command and should be kept ascii-only.

  Will port to 3.0
................
  r67862 | benjamin.peterson | 2008-12-19 20:48:02 -0600 (Fri, 19 Dec 2008) | 1 line

  copy sentence from docstring
................
  r67863 | benjamin.peterson | 2008-12-19 20:51:26 -0600 (Fri, 19 Dec 2008) | 1 line

  add headings
................
  r67864 | benjamin.peterson | 2008-12-19 20:57:19 -0600 (Fri, 19 Dec 2008) | 1 line

  beef up docstring
................
  r67880 | benjamin.peterson | 2008-12-20 16:49:24 -0600 (Sat, 20 Dec 2008) | 1 line

  remove redundant sentence
................
  r67882 | benjamin.peterson | 2008-12-20 16:59:49 -0600 (Sat, 20 Dec 2008) | 1 line

  add some recent releases to the list
................
  r67885 | benjamin.peterson | 2008-12-20 17:48:54 -0600 (Sat, 20 Dec 2008) | 1 line

  silence annoying DeprecationWarning
................
  r67889 | benjamin.peterson | 2008-12-20 19:04:32 -0600 (Sat, 20 Dec 2008) | 1 line

  sphinx.web is long gone
................
  r67890 | benjamin.peterson | 2008-12-20 19:12:26 -0600 (Sat, 20 Dec 2008) | 1 line

  update readme
................
  r67891 | benjamin.peterson | 2008-12-20 19:14:47 -0600 (Sat, 20 Dec 2008) | 1 line

  there are way too many places which need to have the current version added
................
  r67892 | benjamin.peterson | 2008-12-20 19:29:32 -0600 (Sat, 20 Dec 2008) | 9 lines

  Merged revisions 67809 via svnmerge from
  svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3

  ........
    r67809 | benjamin.peterson | 2008-12-15 21:54:45 -0600 (Mon, 15 Dec 2008) | 1 line

    fix logic error
  ........
................
  r67895 | neal.norwitz | 2008-12-21 08:28:32 -0600 (Sun, 21 Dec 2008) | 2 lines

  Add Tarek for work on distutils.
................
This commit is contained in:
Benjamin Peterson 2008-12-21 17:01:26 +00:00
parent e1ae366084
commit c6e80eb5ee
32 changed files with 267 additions and 163 deletions

View File

@ -74,10 +74,9 @@ Without make
You'll need to checkout the Sphinx package to the `tools/` directory:: 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 Then, you need to install Docutils, either by checking it out via ::
by checking it out via ::
svn co http://svn.python.org/projects/external/docutils-0.4/docutils tools/docutils 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> python tools/sphinx-build.py -b<builder> . build/<outputdirectory>
where `<builder>` is one of html, web or htmlhelp (for explanations see the make where `<builder>` is one of html, text, latex, or htmlhelp (for explanations see
targets above). the make targets above).
Contributing Contributing
============ ============
For bugs in the content, the online version at http://docs.python.org/ has a Bugs in the content should be reported to the Python bug tracker at
"suggest change" facility that can be used to correct errors in the source text http://bugs.python.org.
and submit them as a patch to the maintainers.
Bugs in the toolset should be reported in the Python bug tracker at Bugs in the toolset should be reported in the Sphinx bug tracker at
http://bugs.python.org/. http://www.bitbucket.org/birkenfeld/sphinx/issues/.
You can also send a mail to the Python Documentation Team at docs@python.org, 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. and we will process your request as soon as possible.

View File

@ -563,6 +563,8 @@ This information includes:
+----------------------+---------------------------+-----------------+--------+ +----------------------+---------------------------+-----------------+--------+
| ``classifiers`` | a list of classifiers | list of strings | \(4) | | ``classifiers`` | a list of classifiers | list of strings | \(4) |
+----------------------+---------------------------+-----------------+--------+ +----------------------+---------------------------+-----------------+--------+
| ``platforms`` | a list of platforms | list of strings | |
+----------------------+---------------------------+-----------------+--------+
Notes: Notes:

View File

@ -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 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 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 --- 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 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 reference can be used after the owner from which it was borrowed has in fact
disposed of it. disposed of it.

View File

@ -728,7 +728,7 @@ indexes at which certain conditions are met::
if line.strip() == '': if line.strip() == '':
print 'Blank line at line #%i' % i 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 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 result. The ``cmp``, ``key``, and ``reverse`` arguments are passed through to
the constructed list's ``.sort()`` method. :: the constructed list's ``.sort()`` method. ::

View File

@ -1363,8 +1363,6 @@ available. They are listed here in alphabetical order.
.. index:: .. index::
statement: import statement: import
module: ihooks
module: rexec
module: imp module: imp
.. note:: .. 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 This is an advanced function that is not needed in everyday Python
programming. programming.
The function is invoked by the :keyword:`import` statement. It mainly exists This function is invoked by the :keyword:`import` statement. It can be
so that you can replace it with another function that has a compatible replaced (by importing the :mod:`builtins` module and assigning to
interface, in order to change the semantics of the :keyword:`import` statement. ``builtins.__import__``) in order to change semantics of the
See the built-in module :mod:`imp`, which defines some useful operations out :keyword:`import` statement, but nowadays it is usually simpler to use import
of which you can build your own :func:`__import__` function. 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.
For example, the statement ``import spam`` results in the following call: The function imports the module *name*, potentially using the given *globals*
``__import__('spam', globals(), locals(), [], -1)``; the statement and *locals* to determine how to interpret the name in a package context.
``from spam.ham import eggs`` results in ``__import__('spam.ham', globals(), The *fromlist* gives the names of objects or submodules that should be
locals(), ['eggs'], -1)``. Note that even though ``locals()`` and ``['eggs']`` imported from the module given by *name*. The standard implementation does
are passed in as arguments, the :func:`__import__` function does not set the not use its *locals* argument at all, and uses its *globals* only to
local variable named ``eggs``; this is done by subsequent code that is generated determine the package context of the :keyword:`import` statement.
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 *level* specifies whether to use absolute or relative imports. The default
package context of the :keyword:`import` statement.) 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 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 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 module named by *name*. However, when a non-empty *fromlist* argument is
given, the module named by *name* is returned. This is done for given, the module named by *name* is returned.
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): For example, the statement ``import spam`` results in bytecode resembling the
mod = __import__(name) following code::
components = name.split('.')
for comp in components[1:]: spam = __import__('spam', globals(), locals(), [], -1)
mod = getattr(mod, comp)
return mod
*level* specifies whether to use absolute or relative imports. The default is The statement ``import spam.ham`` results in this call::
``-1`` which indicates both absolute and relative imports will be attempted.
``0`` means only perform absolute imports. Positive values for *level* indicate spam = __import__('spam.ham', globals(), locals(), [], -1)
the number of parent directories to search relative to the directory of the
module calling :func:`__import__`. 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 .. versionchanged:: 2.5
The level parameter was added. The level parameter was added.

View File

@ -21,8 +21,9 @@ was generated in the first place.
The following functions are provided by this module. Except when explicitly The following functions are provided by this module. Except when explicitly
noted otherwise, all return values are floats. noted otherwise, all return values are floats.
Number-theoretic and representation functions:
Number-theoretic and representation functions
---------------------------------------------
.. function:: ceil(x) .. function:: ceil(x)
@ -123,8 +124,8 @@ Number-theoretic and representation functions:
.. function:: modf(x) .. function:: modf(x)
Return the fractional and integer parts of *x*. Both results carry the sign of Return the fractional and integer parts of *x*. Both results carry the sign
*x*, and both are floats. of *x* and are floats.
.. function:: trunc(x) .. 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`` platform C double type), in which case any float *x* with ``abs(x) >= 2**52``
necessarily has no fractional bits. necessarily has no fractional bits.
Power and logarithmic functions:
Power and logarithmic functions
-------------------------------
.. function:: exp(x) .. function:: exp(x)
@ -193,7 +196,8 @@ Power and logarithmic functions:
Return the square root of *x*. Return the square root of *x*.
Trigonometric functions: Trigonometric functions
-----------------------
.. function:: acos(x) .. function:: acos(x)
@ -241,7 +245,8 @@ Trigonometric functions:
Return the tangent of *x* radians. Return the tangent of *x* radians.
Angular conversion: Angular conversion
------------------
.. function:: degrees(x) .. function:: degrees(x)
@ -253,7 +258,8 @@ Angular conversion:
Converts angle *x* from degrees to radians. Converts angle *x* from degrees to radians.
Hyperbolic functions: Hyperbolic functions
--------------------
.. function:: acosh(x) .. function:: acosh(x)
@ -291,7 +297,8 @@ Hyperbolic functions:
Return the hyperbolic tangent of *x*. Return the hyperbolic tangent of *x*.
The module also defines two mathematical constants: Constants
---------
.. data:: pi .. data:: pi

View File

@ -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`. 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. 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 :: 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 :: 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`. argument of :meth:`BaseManager.register`.
If an exception is raised by the call, then then is re-raised by 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 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 Note in particular that an exception will be raised if *methodname* has
not been *exposed* 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 = manager.list(range(10))
>>> l._call_method('__len__') >>> l._callmethod('__len__')
10 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] [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): Traceback (most recent call last):
... ...
IndexError: list index out of range IndexError: list index out of range
.. method:: _get_value() .. method:: _getvalue()
Return a copy of the referent. Return a copy of the referent.

View File

@ -1630,36 +1630,33 @@ directly).
Nevertheless, here's a stab at a callback for an option with variable Nevertheless, here's a stab at a callback for an option with variable
arguments:: arguments::
def vararg_callback(option, opt_str, value, parser): def vararg_callback(option, opt_str, value, parser):
assert value is None assert value is None
done = 0 value = []
value = []
rargs = parser.rargs
while rargs:
arg = rargs[0]
# Stop if we hit an arg like "--foo", "-a", "-fx", "--file=f", def floatable(str):
# etc. Note that this also stops on "-3" or "-3.0", so if try:
# your option takes numeric values, you will need to handle float(str)
# this. return True
if ((arg[:2] == "--" and len(arg) > 2) or except ValueError:
(arg[:1] == "-" and len(arg) > 1 and arg[1] != "-")): return False
break
else:
value.append(arg)
del rargs[0]
setattr(parser.values, option.dest, value) 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", parser.add_option("-c", "--callback", dest="vararg_attr",
action="callback", callback=vararg_callback) 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: .. _optparse-extending-optparse:

View File

@ -156,7 +156,7 @@ copying and removal. For operations on individual files, see also the
Recursively move a file or directory to another location. Recursively move a file or directory to another location.
If the destination is on the current filesystem, then simply use rename. 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 .. versionadded:: 2.3

View File

@ -52,10 +52,10 @@ The variables defined in the :mod:`signal` module are:
.. data:: SIG_DFL .. data:: SIG_DFL
This is one of two standard signal handling options; it will simply perform the This is one of two standard signal handling options; it will simply perform
default function for the signal. For example, on most systems the default the default function for the signal. For example, on most systems the
action for :const:`SIGQUIT` is to dump core and exit, while the default action default action for :const:`SIGQUIT` is to dump core and exit, while the
for :const:`SIGCLD` is to simply ignore it. default action for :const:`SIGCHLD` is to simply ignore it.
.. data:: SIG_IGN .. data:: SIG_IGN

View File

@ -88,8 +88,14 @@ been GPL-compatible; the table below summarizes the various releases.
+----------------+--------------+-----------+------------+-----------------+ +----------------+--------------+-----------+------------+-----------------+
| 2.5.1 | 2.5 | 2007 | 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 | 2.5 | 2008 | PSF | yes |
+----------------+--------------+-----------+------------+-----------------+ +----------------+--------------+-----------+------------+-----------------+
| 2.6.1 | 2.6 | 2008 | PSF | yes |
+----------------+--------------+-----------+------------+-----------------+
.. note:: .. note::

View File

@ -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))

View File

@ -47,7 +47,11 @@ from time import asctime
from pprint import pformat from pprint import pformat
from docutils.io import StringOutput from docutils.io import StringOutput
from docutils.utils import new_document 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: try:
from sphinx.writers.text import TextWriter from sphinx.writers.text import TextWriter

View File

@ -734,7 +734,7 @@ The formatting template uses curly brackets (`{`, `}`) as special characters::
Curly brackets can be escaped by doubling them:: Curly brackets can be escaped by doubling them::
>>> format("Empty dict: {{}}") >>> "Empty dict: {{}}".format()
"Empty dict: {}" "Empty dict: {}"
Field names can be integers indicating positional arguments, such as Field names can be integers indicating positional arguments, such as

View File

@ -55,7 +55,10 @@ the various releases.
2.4.4 2.4.3 2006 PSF yes 2.4.4 2.4.3 2006 PSF yes
2.5 2.4 2006 PSF yes 2.5 2.4 2006 PSF yes
2.5.1 2.5 2007 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 2.5 2008 PSF yes
2.6.1 2.6 2008 PSF yes
Footnotes: Footnotes:

View File

@ -14,13 +14,13 @@ class Set:
def __len__(self): def __len__(self):
return len(self.elts) return len(self.elts)
def __contains__(self, elt): def __contains__(self, elt):
return self.elts.has_key(elt) return elt in self.elts
def add(self, elt): def add(self, elt):
self.elts[elt] = elt self.elts[elt] = elt
def elements(self): def elements(self):
return self.elts.keys() return self.elts.keys()
def has_elt(self, elt): def has_elt(self, elt):
return self.elts.has_key(elt) return elt in self.elts
def remove(self, elt): def remove(self, elt):
del self.elts[elt] del self.elts[elt]
def copy(self): def copy(self):

View File

@ -210,7 +210,7 @@ def dfs_postorder(b, seen):
order = [] order = []
seen[b] = b seen[b] = b
for c in b.get_children(): for c in b.get_children():
if seen.has_key(c): if c in seen:
continue continue
order = order + dfs_postorder(c, seen) order = order + dfs_postorder(c, seen)
order.append(b) order.append(b)
@ -406,7 +406,7 @@ class PyFlowGraph(FlowGraph):
seen = {} seen = {}
def max_depth(b, d): def max_depth(b, d):
if seen.has_key(b): if b in seen:
return d return d
seen[b] = 1 seen[b] = 1
d = d + depth[b] d = d + depth[b]
@ -482,7 +482,7 @@ class PyFlowGraph(FlowGraph):
for name in self.cellvars: for name in self.cellvars:
cells[name] = 1 cells[name] = 1
self.cellvars = [name for name in self.varnames self.cellvars = [name for name in self.varnames
if cells.has_key(name)] if name in cells]
for name in self.cellvars: for name in self.cellvars:
del cells[name] del cells[name]
self.cellvars = self.cellvars + cells.keys() self.cellvars = self.cellvars + cells.keys()

View File

@ -49,9 +49,9 @@ class Scope:
def add_global(self, name): def add_global(self, name):
name = self.mangle(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 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" % \ raise SyntaxError, "%s in %s is global and parameter" % \
(name, self.name) (name, self.name)
self.globals[name] = 1 self.globals[name] = 1
@ -88,14 +88,13 @@ class Scope:
The scope of a name could be LOCAL, GLOBAL, FREE, or CELL. 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 return SC_GLOBAL
if self.cells.has_key(name): if name in self.cells:
return SC_CELL return SC_CELL
if self.defs.has_key(name): if name in self.defs:
return SC_LOCAL return SC_LOCAL
if self.nested and (self.frees.has_key(name) or if self.nested and (name in self.frees or name in self.uses):
self.uses.has_key(name)):
return SC_FREE return SC_FREE
if self.nested: if self.nested:
return SC_UNKNOWN return SC_UNKNOWN
@ -108,8 +107,7 @@ class Scope:
free = {} free = {}
free.update(self.frees) free.update(self.frees)
for name in self.uses.keys(): for name in self.uses.keys():
if not (self.defs.has_key(name) or if name not in self.defs and name not in self.globals:
self.globals.has_key(name)):
free[name] = 1 free[name] = 1
return free.keys() return free.keys()
@ -134,7 +132,7 @@ class Scope:
free. free.
""" """
self.globals[name] = 1 self.globals[name] = 1
if self.frees.has_key(name): if name in self.frees:
del self.frees[name] del self.frees[name]
for child in self.children: for child in self.children:
if child.check_name(name) == SC_FREE: if child.check_name(name) == SC_FREE:

View File

@ -81,7 +81,7 @@ def extractLineNo(ast):
def Node(*args): def Node(*args):
kind = args[0] kind = args[0]
if nodes.has_key(kind): if kind in nodes:
try: try:
return nodes[kind](*args[1:]) return nodes[kind](*args[1:])
except TypeError: except TypeError:
@ -120,7 +120,7 @@ class Transformer:
def transform(self, tree): def transform(self, tree):
"""Transform an AST into a modified parse tree.""" """Transform an AST into a modified parse tree."""
if not (isinstance(tree, tuple) or isinstance(tree, list)): 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) return self.compile_node(tree)
def parsesuite(self, text): def parsesuite(self, text):

View File

@ -84,7 +84,7 @@ class ExampleASTVisitor(ASTVisitor):
meth(node, *args) meth(node, *args)
elif self.VERBOSE > 0: elif self.VERBOSE > 0:
klass = node.__class__ klass = node.__class__
if not self.examples.has_key(klass): if klass not in self.examples:
self.examples[klass] = klass self.examples[klass] = klass
print print
print self.visitor print self.visitor

View File

@ -1041,7 +1041,7 @@ main (int argc, char **argv) {
return move_file (src, dst, dry_run=self.dry_run) return move_file (src, dst, dry_run=self.dry_run)
def mkpath (self, name, mode=0777): def mkpath (self, name, mode=0777):
mkpath (name, mode, self.dry_run) mkpath (name, mode, dry_run=self.dry_run)
# class CCompiler # class CCompiler

View File

@ -40,7 +40,8 @@ class StdoutRefactoringTool(refactor.RefactoringTool):
# Actually write the new file # Actually write the new file
super(StdoutRefactoringTool, self).write_file(new_text, super(StdoutRefactoringTool, self).write_file(new_text,
filename, old_text) filename, old_text)
shutil.copymode(filename, backup) if not self.nobackups:
shutil.copymode(filename, backup)
def print_output(self, lines): def print_output(self, lines):
for line in lines: for line in lines:

View File

@ -846,7 +846,7 @@ class PlaceHolder:
Add the specified logger as a child of this placeholder. Add the specified logger as a child of this placeholder.
""" """
#if alogger not in self.loggers: #if alogger not in self.loggers:
if not self.loggerMap.has_key(alogger): if alogger not in self.loggerMap:
#self.loggers.append(alogger) #self.loggers.append(alogger)
self.loggerMap[alogger] = None self.loggerMap[alogger] = None

View File

@ -174,7 +174,7 @@ What a mess!
text = ("Python 1.0.0 was released on 1994-01-26. Python 1.0.1 was\n" text = ("Python 1.0.0 was released on 1994-01-26. Python 1.0.1 was\n"
"released on 1994-02-15.") "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', '1994-01-26. Python 1.0.1 was',
'released on 1994-02-15.']) 'released on 1994-02-15.'])
self.check_wrap(text, 40, ['Python 1.0.0 was released on 1994-01-26.', 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) otext = self.wrapper.fill(text)
assert isinstance(otext, unicode) 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): def test_split(self):
# Ensure that the standard _split() method works as advertised # Ensure that the standard _split() method works as advertised
# in the comments # in the comments

View File

@ -1104,6 +1104,51 @@ class MiscTests(unittest.TestCase):
else: else:
self.assert_(False) 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): def test_main(verbose=None):
from test import test_urllib2 from test import test_urllib2
@ -1112,7 +1157,8 @@ def test_main(verbose=None):
tests = (TrivialTests, tests = (TrivialTests,
OpenerDirectorTests, OpenerDirectorTests,
HandlerTests, HandlerTests,
MiscTests) MiscTests,
RequestTests)
test_support.run_unittest(*tests) test_support.run_unittest(*tests)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -84,16 +84,16 @@ class TextWrapper:
# splits into # splits into
# Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option! # Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option!
# (after stripping out empty strings). # (after stripping out empty strings).
wordsep_re = re.compile( wordsep_re = (
r'(\s+|' # any whitespace 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 r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') # em-dash
# This less funky little regex just split on recognized spaces. E.g. # This less funky little regex just split on recognized spaces. E.g.
# "Hello there -- you goof-ball, use the -b option!" # "Hello there -- you goof-ball, use the -b option!"
# splits into # splits into
# Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/ # 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 # XXX this is not locale- or charset-aware -- string.lowercase
# is US-ASCII only (and therefore English-only) # is US-ASCII only (and therefore English-only)
@ -160,10 +160,12 @@ class TextWrapper:
'use', ' ', 'the', ' ', '-b', ' ', option!' 'use', ' ', 'the', ' ', '-b', ' ', option!'
otherwise. otherwise.
""" """
if self.break_on_hyphens is True: flags = re.UNICODE if isinstance(text, unicode) else 0
chunks = self.wordsep_re.split(text) if self.break_on_hyphens:
pat = self.wordsep_re
else: 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 chunks = filter(None, chunks) # remove empty chunks
return chunks return chunks

View File

@ -15,6 +15,10 @@ Core and Builtins
- Issue #4597: Fixed several opcodes that weren't always propagating - Issue #4597: Fixed several opcodes that weren't always propagating
exceptions. 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 - Issue #4589: Fixed exception handling when the __exit__ function of a
context manager returns a value that cannot be converted to a bool. context manager returns a value that cannot be converted to a bool.
@ -114,10 +118,21 @@ Core and Builtins
Library 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 - 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 give correct results in the case where one argument is a quiet NaN
and the other is a finite number that requires rounding. 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 - Issue #4529: fix the parser module's validation of try-except-finally
statements. statements.
@ -177,6 +192,9 @@ Build
C-API 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 - Issue #4122: On Windows, fix a compilation error when using the
Py_UNICODE_ISSPACE macro in an extension module. Py_UNICODE_ISSPACE macro in an extension module.

View File

@ -17,6 +17,9 @@ the format to accommodate documentation needs as they arise.
Permissions History 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, - Hirokazu Yamamoto was given SVN access on August 12 2008 by MvL,
for contributions to the Windows build. for contributions to the Windows build.

View File

@ -740,6 +740,24 @@ clear_freelists(void)
(void)PyFloat_ClearFreeList(); (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 /* This is the main function. Read this to understand how the
* collection process works. */ * collection process works. */
static Py_ssize_t static Py_ssize_t
@ -762,16 +780,7 @@ collect(int generation)
} }
if (debug & DEBUG_STATS) { if (debug & DEBUG_STATS) {
if (tmod != NULL) { t1 = get_time();
PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
if (f == NULL) {
PyErr_Clear();
}
else {
t1 = PyFloat_AsDouble(f);
Py_DECREF(f);
}
}
PySys_WriteStderr("gc: collecting generation %d...\n", PySys_WriteStderr("gc: collecting generation %d...\n",
generation); generation);
PySys_WriteStderr("gc: objects in each generation:"); PySys_WriteStderr("gc: objects in each generation:");
@ -844,17 +853,6 @@ collect(int generation)
if (debug & DEBUG_COLLECTABLE) { if (debug & DEBUG_COLLECTABLE) {
debug_cycle("collectable", FROM_GC(gc)); 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. */ /* Clear weakrefs and invoke callbacks as necessary. */
@ -876,14 +874,19 @@ collect(int generation)
debug_cycle("uncollectable", FROM_GC(gc)); debug_cycle("uncollectable", FROM_GC(gc));
} }
if (debug & DEBUG_STATS) { if (debug & DEBUG_STATS) {
double t2 = get_time();
if (m == 0 && n == 0) if (m == 0 && n == 0)
PySys_WriteStderr("gc: done.\n"); PySys_WriteStderr("gc: done");
else else
PySys_WriteStderr( PySys_WriteStderr(
"gc: done, " "gc: done, "
"%" PY_FORMAT_SIZE_T "d unreachable, " "%" PY_FORMAT_SIZE_T "d unreachable, "
"%" PY_FORMAT_SIZE_T "d uncollectable.\n", "%" PY_FORMAT_SIZE_T "d uncollectable",
n+m, n); n+m, n);
if (t1 && t2) {
PySys_WriteStderr(", %.4fs elapsed", t2-t1);
}
PySys_WriteStderr(".\n");
} }
/* Append instances in the uncollectable set to a Python /* Append instances in the uncollectable set to a Python

View File

@ -630,7 +630,10 @@ error:
return NULL; 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 * static PyObject *
math_trunc(PyObject *self, PyObject *number) math_trunc(PyObject *self, PyObject *number)
@ -764,7 +767,7 @@ PyDoc_STRVAR(math_modf_doc,
"modf(x)\n" "modf(x)\n"
"\n" "\n"
"Return the fractional and integer parts of x. Both results carry the sign\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 /* 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 do that by itself -- loghelper can. func is log or log10, and name is

View File

@ -331,8 +331,11 @@ void _PyObject_Dump(PyObject* op)
if (op == NULL) if (op == NULL)
fprintf(stderr, "NULL\n"); fprintf(stderr, "NULL\n");
else { else {
PyGILState_STATE gil;
fprintf(stderr, "object : "); fprintf(stderr, "object : ");
gil = PyGILState_Ensure();
(void)PyObject_Print(op, stderr, 0); (void)PyObject_Print(op, stderr, 0);
PyGILState_Release(gil);
/* XXX(twouters) cast refcount to long until %zd is /* XXX(twouters) cast refcount to long until %zd is
universally available */ universally available */
fprintf(stderr, "\n" fprintf(stderr, "\n"

View File

@ -26,7 +26,7 @@ complies with this agreement, provided that you do not:
- alter any copyright, trademark or patent notice in Microsoft's - alter any copyright, trademark or patent notice in Microsoft's
Distributable Code; Distributable Code;
- use Microsofts 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; suggests your programs come from or are endorsed by Microsoft;
- distribute Microsoft's Distributable Code to run on a platform other - distribute Microsoft's Distributable Code to run on a platform other