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:
parent
e1ae366084
commit
c6e80eb5ee
|
@ -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.
|
||||||
|
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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. ::
|
||||||
|
|
|
@ -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:]:
|
|
||||||
mod = getattr(mod, comp)
|
|
||||||
return mod
|
|
||||||
|
|
||||||
*level* specifies whether to use absolute or relative imports. The default is
|
spam = __import__('spam', globals(), locals(), [], -1)
|
||||||
``-1`` which indicates both absolute and relative imports will be attempted.
|
|
||||||
``0`` means only perform absolute imports. Positive values for *level* indicate
|
The statement ``import spam.ham`` results in this call::
|
||||||
the number of parent directories to search relative to the directory of the
|
|
||||||
module calling :func:`__import__`.
|
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
|
.. versionchanged:: 2.5
|
||||||
The level parameter was added.
|
The level parameter was added.
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -1632,34 +1632,31 @@ 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
|
||||||
|
|
||||||
|
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
|
break
|
||||||
else:
|
|
||||||
value.append(arg)
|
value.append(arg)
|
||||||
del rargs[0]
|
|
||||||
|
|
||||||
setattr(parser.values, option.dest, value)
|
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:
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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::
|
||||||
|
|
||||||
|
|
|
@ -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))
|
|
|
@ -47,6 +47,10 @@ 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
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sphinx.builders import Builder
|
||||||
|
except ImportError:
|
||||||
from sphinx.builder import Builder
|
from sphinx.builder import Builder
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -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
|
||||||
|
|
3
LICENSE
3
LICENSE
|
@ -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:
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -40,6 +40,7 @@ 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)
|
||||||
|
if not self.nobackups:
|
||||||
shutil.copymode(filename, backup)
|
shutil.copymode(filename, backup)
|
||||||
|
|
||||||
def print_output(self, lines):
|
def print_output(self, lines):
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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__":
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
18
Misc/NEWS
18
Misc/NEWS
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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 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;
|
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
|
||||||
|
|
Loading…
Reference in New Issue