mirror of https://github.com/python/cpython
Merged revisions 67952-67953,67955,67957-67958,67960-67961,67963,67965,67967,67970-67971,67973,67982,67988,67990,67995,68014,68016,68030,68057,68061,68112,68115-68118,68120-68121,68123-68128 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r67952 | georg.brandl | 2008-12-27 18:42:40 +0100 (Sat, 27 Dec 2008) | 2 lines #4752: actually use custom handler in example. ........ r67953 | georg.brandl | 2008-12-27 19:20:04 +0100 (Sat, 27 Dec 2008) | 3 lines Patch #4739 by David Laban: add symbols to pydoc help topics, so that ``help('@')`` works as expected. ........ r67955 | georg.brandl | 2008-12-27 19:27:53 +0100 (Sat, 27 Dec 2008) | 3 lines Follow-up to r67746 in order to restore backwards-compatibility for those who (monkey-)patch TextWrapper.wordsep_re with a custom RE. ........ r67957 | georg.brandl | 2008-12-27 19:49:19 +0100 (Sat, 27 Dec 2008) | 2 lines #4754: improve winsound documentation. ........ r67958 | georg.brandl | 2008-12-27 20:02:59 +0100 (Sat, 27 Dec 2008) | 2 lines #4682: 'b' is actually unsigned char. ........ r67960 | georg.brandl | 2008-12-27 20:04:44 +0100 (Sat, 27 Dec 2008) | 2 lines #4695: fix backslashery. ........ r67961 | georg.brandl | 2008-12-27 20:06:04 +0100 (Sat, 27 Dec 2008) | 2 lines Use :samp: role. ........ r67963 | georg.brandl | 2008-12-27 20:11:15 +0100 (Sat, 27 Dec 2008) | 2 lines #4671: document that pydoc imports modules. ........ r67965 | antoine.pitrou | 2008-12-27 21:34:52 +0100 (Sat, 27 Dec 2008) | 3 lines Issue #4677: add two list comprehension tests to pybench. ........ r67967 | benjamin.peterson | 2008-12-27 23:18:58 +0100 (Sat, 27 Dec 2008) | 1 line fix markup ........ r67970 | alexandre.vassalotti | 2008-12-28 02:52:58 +0100 (Sun, 28 Dec 2008) | 2 lines Fix name mangling of PyUnicode_ClearFreeList. ........ r67971 | alexandre.vassalotti | 2008-12-28 03:10:35 +0100 (Sun, 28 Dec 2008) | 2 lines Sort UCS-2/UCS-4 name mangling list. ........ r67973 | alexandre.vassalotti | 2008-12-28 03:58:22 +0100 (Sun, 28 Dec 2008) | 2 lines Document Py_VaBuildValue. ........ r67982 | benjamin.peterson | 2008-12-28 16:37:31 +0100 (Sun, 28 Dec 2008) | 1 line fix WORD_BIGEDIAN declaration in Universal builds; fixes #4060 and #4728 ........ r67988 | ronald.oussoren | 2008-12-28 20:40:56 +0100 (Sun, 28 Dec 2008) | 1 line Issue4064: architecture string for universal builds on OSX ........ r67990 | ronald.oussoren | 2008-12-28 20:50:40 +0100 (Sun, 28 Dec 2008) | 3 lines Update the fix for issue4064 to deal correctly with all three variants of universal builds that are presented by the configure script. ........ r67995 | benjamin.peterson | 2008-12-28 22:16:07 +0100 (Sun, 28 Dec 2008) | 1 line #4763 PyErr_ExceptionMatches won't blow up with NULL arguments ........ r68014 | benjamin.peterson | 2008-12-29 18:47:42 +0100 (Mon, 29 Dec 2008) | 1 line #4764 set IOError.filename when trying to open a directory on POSIX platforms ........ r68016 | benjamin.peterson | 2008-12-29 18:56:58 +0100 (Mon, 29 Dec 2008) | 1 line #4764 in io.open, set IOError.filename when trying to open a directory on POSIX platforms ........ r68030 | benjamin.peterson | 2008-12-29 22:38:14 +0100 (Mon, 29 Dec 2008) | 1 line fix French ........ r68057 | vinay.sajip | 2008-12-30 08:01:25 +0100 (Tue, 30 Dec 2008) | 1 line Minor documentation change relating to NullHandler. ........ r68061 | georg.brandl | 2008-12-30 11:15:49 +0100 (Tue, 30 Dec 2008) | 2 lines #4778: attributes can't be called. ........ r68112 | benjamin.peterson | 2009-01-01 00:48:39 +0100 (Thu, 01 Jan 2009) | 1 line #4795 inspect.isgeneratorfunction() should return False instead of None ........ r68115 | benjamin.peterson | 2009-01-01 05:04:41 +0100 (Thu, 01 Jan 2009) | 1 line simplfy code ........ r68116 | georg.brandl | 2009-01-01 12:46:51 +0100 (Thu, 01 Jan 2009) | 2 lines #4100: note that element children are not necessarily present on "start" events. ........ r68117 | georg.brandl | 2009-01-01 12:53:55 +0100 (Thu, 01 Jan 2009) | 2 lines #4156: make clear that "protocol" is to be replaced with the protocol name. ........ r68118 | georg.brandl | 2009-01-01 13:00:19 +0100 (Thu, 01 Jan 2009) | 2 lines #4185: clarify escape behavior of replacement strings. ........ r68120 | georg.brandl | 2009-01-01 13:15:31 +0100 (Thu, 01 Jan 2009) | 4 lines #4228: Pack negative values the same way as 2.4 in struct's L format. ........ r68121 | georg.brandl | 2009-01-01 13:43:33 +0100 (Thu, 01 Jan 2009) | 2 lines Point to types module in new module deprecation notice. ........ r68123 | georg.brandl | 2009-01-01 13:52:29 +0100 (Thu, 01 Jan 2009) | 2 lines #4784: ... on three counts ... ........ r68124 | georg.brandl | 2009-01-01 13:53:19 +0100 (Thu, 01 Jan 2009) | 2 lines #4782: Fix markup error that hid load() and loads(). ........ r68125 | georg.brandl | 2009-01-01 14:02:09 +0100 (Thu, 01 Jan 2009) | 2 lines #4776: add data_files and package_dir arguments. ........ r68126 | georg.brandl | 2009-01-01 14:05:13 +0100 (Thu, 01 Jan 2009) | 2 lines Handlers are in the `logging.handlers` module. ........ r68127 | georg.brandl | 2009-01-01 14:14:49 +0100 (Thu, 01 Jan 2009) | 2 lines #4767: Use correct submodules for all MIME classes. ........ r68128 | antoine.pitrou | 2009-01-01 15:11:22 +0100 (Thu, 01 Jan 2009) | 3 lines Issue #3680: Reference cycles created through a dict, set or deque iterator did not get collected. ........
This commit is contained in:
parent
b5fc36c86e
commit
47fe9817f1
|
@ -136,8 +136,9 @@ variable(s) whose address should be passed.
|
||||||
them. Instead, the implementation assumes that the string object uses the
|
them. Instead, the implementation assumes that the string object uses the
|
||||||
encoding passed in as parameter.
|
encoding passed in as parameter.
|
||||||
|
|
||||||
``b`` (integer) [char]
|
``b`` (integer) [unsigned char]
|
||||||
Convert a Python integer to a tiny int, stored in a C :ctype:`char`.
|
Convert a nonnegative Python integer to an unsigned tiny int, stored in a C
|
||||||
|
:ctype:`unsigned char`.
|
||||||
|
|
||||||
``B`` (integer) [unsigned char]
|
``B`` (integer) [unsigned char]
|
||||||
Convert a Python integer to a tiny int without overflow checking, stored in a C
|
Convert a Python integer to a tiny int without overflow checking, stored in a C
|
||||||
|
@ -533,3 +534,8 @@ and the following format units are left untouched.
|
||||||
|
|
||||||
If there is an error in the format string, the :exc:`SystemError` exception is
|
If there is an error in the format string, the :exc:`SystemError` exception is
|
||||||
set and *NULL* returned.
|
set and *NULL* returned.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* Py_VaBuildValue(const char *format, va_list vargs)
|
||||||
|
|
||||||
|
Identical to :cfunc:`Py_BuildValue`, except that it accepts a va_list
|
||||||
|
rather than a variable number of arguments.
|
||||||
|
|
|
@ -73,11 +73,10 @@ is a separate error indicator for each thread.
|
||||||
|
|
||||||
.. cfunction:: int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)
|
.. cfunction:: int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)
|
||||||
|
|
||||||
Return true if the *given* exception matches the exception in *exc*. If *exc*
|
Return true if the *given* exception matches the exception in *exc*. If
|
||||||
is a class object, this also returns true when *given* is an instance of a
|
*exc* is a class object, this also returns true when *given* is an instance
|
||||||
subclass. If *exc* is a tuple, all exceptions in the tuple (and recursively in
|
of a subclass. If *exc* is a tuple, all exceptions in the tuple (and
|
||||||
subtuples) are searched for a match. If *given* is *NULL*, a memory access
|
recursively in subtuples) are searched for a match.
|
||||||
violation will occur.
|
|
||||||
|
|
||||||
|
|
||||||
.. cfunction:: void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)
|
.. cfunction:: void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)
|
||||||
|
|
|
@ -88,9 +88,9 @@ setup script). Indirectly provides the :class:`distutils.dist.Distribution` and
|
||||||
| *options* | default options for the setup | a string |
|
| *options* | default options for the setup | a string |
|
||||||
| | script | |
|
| | script | |
|
||||||
+--------------------+--------------------------------+-------------------------------------------------------------+
|
+--------------------+--------------------------------+-------------------------------------------------------------+
|
||||||
| *license* | The license for the package | |
|
| *license* | The license for the package | a string |
|
||||||
+--------------------+--------------------------------+-------------------------------------------------------------+
|
+--------------------+--------------------------------+-------------------------------------------------------------+
|
||||||
| *keywords* | Descriptive meta-data. See | |
|
| *keywords* | Descriptive meta-data, see | |
|
||||||
| | :pep:`314` | |
|
| | :pep:`314` | |
|
||||||
+--------------------+--------------------------------+-------------------------------------------------------------+
|
+--------------------+--------------------------------+-------------------------------------------------------------+
|
||||||
| *platforms* | | |
|
| *platforms* | | |
|
||||||
|
@ -98,6 +98,13 @@ setup script). Indirectly provides the :class:`distutils.dist.Distribution` and
|
||||||
| *cmdclass* | A mapping of command names to | a dictionary |
|
| *cmdclass* | A mapping of command names to | a dictionary |
|
||||||
| | :class:`Command` subclasses | |
|
| | :class:`Command` subclasses | |
|
||||||
+--------------------+--------------------------------+-------------------------------------------------------------+
|
+--------------------+--------------------------------+-------------------------------------------------------------+
|
||||||
|
| *data_files* | A list of data files to | a list |
|
||||||
|
| | install | |
|
||||||
|
+--------------------+--------------------------------+-------------------------------------------------------------+
|
||||||
|
| *package_dir* | A mapping of package to | a dictionary |
|
||||||
|
| | directory names | |
|
||||||
|
+--------------------+--------------------------------+-------------------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. function:: run_setup(script_name[, script_args=None, stop_after='run'])
|
.. function:: run_setup(script_name[, script_args=None, stop_after='run'])
|
||||||
|
@ -1100,6 +1107,24 @@ other utility module.
|
||||||
|
|
||||||
For non-POSIX platforms, currently just returns ``sys.platform``.
|
For non-POSIX platforms, currently just returns ``sys.platform``.
|
||||||
|
|
||||||
|
For MacOS X systems the OS version reflects the minimal version on which
|
||||||
|
binaries will run (that is, the value of ``MACOSX_DEPLOYMENT_TARGET``
|
||||||
|
during the build of Python), not the OS version of the current system.
|
||||||
|
|
||||||
|
For universal binary builds on MacOS X the architecture value reflects
|
||||||
|
the univeral binary status instead of the architecture of the current
|
||||||
|
processor. For 32-bit universal binaries the architecture is ``fat``,
|
||||||
|
for 64-bit universal binaries the architecture is ``fat64``, and
|
||||||
|
for 4-way universal binaries the architecture is ``universal``.
|
||||||
|
|
||||||
|
Examples of returned values on MacOS X:
|
||||||
|
|
||||||
|
* ``macosx-10.3-ppc``
|
||||||
|
|
||||||
|
* ``macosx-10.3-fat``
|
||||||
|
|
||||||
|
* ``macosx-10.5-universal``
|
||||||
|
|
||||||
.. % XXX isn't this also provided by some other non-distutils module?
|
.. % XXX isn't this also provided by some other non-distutils module?
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ For a while people just wrote programs that didn't display accents. I remember
|
||||||
looking at Apple ][ BASIC programs, published in French-language publications in
|
looking at Apple ][ BASIC programs, published in French-language publications in
|
||||||
the mid-1980s, that had lines like these::
|
the mid-1980s, that had lines like these::
|
||||||
|
|
||||||
PRINT "FICHER EST COMPLETE."
|
PRINT "FICHIER EST COMPLETE."
|
||||||
PRINT "CARACTERE NON ACCEPTE."
|
PRINT "CARACTERE NON ACCEPTE."
|
||||||
|
|
||||||
Those messages should contain accents, and they just look wrong to someone who
|
Those messages should contain accents, and they just look wrong to someone who
|
||||||
|
|
|
@ -19,6 +19,7 @@ things easier.
|
||||||
|
|
||||||
Here are the classes:
|
Here are the classes:
|
||||||
|
|
||||||
|
.. currentmodule:: email.mime.base
|
||||||
|
|
||||||
.. class:: MIMEBase(_maintype, _subtype, **_params)
|
.. class:: MIMEBase(_maintype, _subtype, **_params)
|
||||||
|
|
||||||
|
@ -39,6 +40,8 @@ Here are the classes:
|
||||||
:mailheader:`MIME-Version` header (always set to ``1.0``).
|
:mailheader:`MIME-Version` header (always set to ``1.0``).
|
||||||
|
|
||||||
|
|
||||||
|
.. currentmodule:: email.mime.nonmultipart
|
||||||
|
|
||||||
.. class:: MIMENonMultipart()
|
.. class:: MIMENonMultipart()
|
||||||
|
|
||||||
Module: :mod:`email.mime.nonmultipart`
|
Module: :mod:`email.mime.nonmultipart`
|
||||||
|
@ -52,6 +55,8 @@ Here are the classes:
|
||||||
.. versionadded:: 2.2.2
|
.. versionadded:: 2.2.2
|
||||||
|
|
||||||
|
|
||||||
|
.. currentmodule:: email.mime.multipart
|
||||||
|
|
||||||
.. class:: MIMEMultipart([subtype[, boundary[, _subparts[, _params]]]])
|
.. class:: MIMEMultipart([subtype[, boundary[, _subparts[, _params]]]])
|
||||||
|
|
||||||
Module: :mod:`email.mime.multipart`
|
Module: :mod:`email.mime.multipart`
|
||||||
|
@ -77,6 +82,8 @@ Here are the classes:
|
||||||
.. versionadded:: 2.2.2
|
.. versionadded:: 2.2.2
|
||||||
|
|
||||||
|
|
||||||
|
.. currentmodule:: email.mime.application
|
||||||
|
|
||||||
.. class:: MIMEApplication(_data[, _subtype[, _encoder[, **_params]]])
|
.. class:: MIMEApplication(_data[, _subtype[, _encoder[, **_params]]])
|
||||||
|
|
||||||
Module: :mod:`email.mime.application`
|
Module: :mod:`email.mime.application`
|
||||||
|
@ -99,6 +106,8 @@ Here are the classes:
|
||||||
.. versionadded:: 2.5
|
.. versionadded:: 2.5
|
||||||
|
|
||||||
|
|
||||||
|
.. currentmodule:: email.mime.audio
|
||||||
|
|
||||||
.. class:: MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])
|
.. class:: MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])
|
||||||
|
|
||||||
Module: :mod:`email.mime.audio`
|
Module: :mod:`email.mime.audio`
|
||||||
|
@ -122,6 +131,8 @@ Here are the classes:
|
||||||
*_params* are passed straight through to the base class constructor.
|
*_params* are passed straight through to the base class constructor.
|
||||||
|
|
||||||
|
|
||||||
|
.. currentmodule:: email.mime.image
|
||||||
|
|
||||||
.. class:: MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])
|
.. class:: MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])
|
||||||
|
|
||||||
Module: :mod:`email.mime.image`
|
Module: :mod:`email.mime.image`
|
||||||
|
@ -145,6 +156,8 @@ Here are the classes:
|
||||||
*_params* are passed straight through to the :class:`MIMEBase` constructor.
|
*_params* are passed straight through to the :class:`MIMEBase` constructor.
|
||||||
|
|
||||||
|
|
||||||
|
.. currentmodule:: email.mime.message
|
||||||
|
|
||||||
.. class:: MIMEMessage(_msg[, _subtype])
|
.. class:: MIMEMessage(_msg[, _subtype])
|
||||||
|
|
||||||
Module: :mod:`email.mime.message`
|
Module: :mod:`email.mime.message`
|
||||||
|
@ -158,6 +171,8 @@ Here are the classes:
|
||||||
:mimetype:`rfc822`.
|
:mimetype:`rfc822`.
|
||||||
|
|
||||||
|
|
||||||
|
.. currentmodule:: email.mime.text
|
||||||
|
|
||||||
.. class:: MIMEText(_text[, _subtype[, _charset]])
|
.. class:: MIMEText(_text[, _subtype[, _charset]])
|
||||||
|
|
||||||
Module: :mod:`email.mime.text`
|
Module: :mod:`email.mime.text`
|
||||||
|
|
|
@ -166,7 +166,7 @@ Basic Usage
|
||||||
:func:`dump`.
|
:func:`dump`.
|
||||||
|
|
||||||
|
|
||||||
.. function load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, **kw]]]]]]])
|
.. function:: load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, **kw]]]]]]])
|
||||||
|
|
||||||
Deserialize *fp* (a ``.read()``-supporting file-like object containing a JSON
|
Deserialize *fp* (a ``.read()``-supporting file-like object containing a JSON
|
||||||
document) to a Python object.
|
document) to a Python object.
|
||||||
|
@ -202,7 +202,7 @@ Basic Usage
|
||||||
class.
|
class.
|
||||||
|
|
||||||
|
|
||||||
.. function loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, **kw]]]]]]])
|
.. function:: loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, **kw]]]]]]])
|
||||||
|
|
||||||
Deserialize *s* (a :class:`str` or :class:`unicode` instance containing a JSON
|
Deserialize *s* (a :class:`str` or :class:`unicode` instance containing a JSON
|
||||||
document) to a Python object.
|
document) to a Python object.
|
||||||
|
|
|
@ -553,10 +553,10 @@ provided:
|
||||||
#. :class:`HTTPHandler` instances send error messages to an HTTP server using
|
#. :class:`HTTPHandler` instances send error messages to an HTTP server using
|
||||||
either ``GET`` or ``POST`` semantics.
|
either ``GET`` or ``POST`` semantics.
|
||||||
|
|
||||||
The :class:`StreamHandler` and :class:`FileHandler` classes are defined in the
|
The :class:`NullHandler`, :class:`StreamHandler` and :class:`FileHandler`
|
||||||
core logging package. The other handlers are defined in a sub- module,
|
classes are defined in the core logging package. The other handlers are
|
||||||
:mod:`logging.handlers`. (There is also another sub-module,
|
defined in a sub- module, :mod:`logging.handlers`. (There is also another
|
||||||
:mod:`logging.config`, for configuration functionality.)
|
sub-module, :mod:`logging.config`, for configuration functionality.)
|
||||||
|
|
||||||
Logged messages are formatted for presentation through instances of the
|
Logged messages are formatted for presentation through instances of the
|
||||||
:class:`Formatter` class. They are initialized with a format string suitable for
|
:class:`Formatter` class. They are initialized with a format string suitable for
|
||||||
|
@ -1544,6 +1544,8 @@ subclasses. However, the :meth:`__init__` method in subclasses needs to call
|
||||||
StreamHandler
|
StreamHandler
|
||||||
^^^^^^^^^^^^^
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. module:: logging.handlers
|
||||||
|
|
||||||
The :class:`StreamHandler` class, located in the core :mod:`logging` package,
|
The :class:`StreamHandler` class, located in the core :mod:`logging` package,
|
||||||
sends logging output to streams such as *sys.stdout*, *sys.stderr* or any
|
sends logging output to streams such as *sys.stdout*, *sys.stderr* or any
|
||||||
file-like object (or, more precisely, any object which supports :meth:`write`
|
file-like object (or, more precisely, any object which supports :meth:`write`
|
||||||
|
@ -2050,6 +2052,8 @@ supports sending logging messages to a Web server, using either ``GET`` or
|
||||||
Formatter Objects
|
Formatter Objects
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
.. currentmodule:: logging
|
||||||
|
|
||||||
:class:`Formatter`\ s have the following attributes and methods. They are
|
:class:`Formatter`\ s have the following attributes and methods. They are
|
||||||
responsible for converting a :class:`LogRecord` to (usually) a string which can
|
responsible for converting a :class:`LogRecord` to (usually) a string which can
|
||||||
be interpreted by either a human or an external system. The base
|
be interpreted by either a human or an external system. The base
|
||||||
|
|
|
@ -358,7 +358,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the
|
||||||
|
|
||||||
.. attribute:: daemon
|
.. attribute:: daemon
|
||||||
|
|
||||||
The process's daemon flag, a Boolean value. This must be called before
|
The process's daemon flag, a Boolean value. This must be set before
|
||||||
:meth:`start` is called.
|
:meth:`start` is called.
|
||||||
|
|
||||||
The initial value is inherited from the creating process.
|
The initial value is inherited from the creating process.
|
||||||
|
@ -1810,9 +1810,9 @@ Address Formats
|
||||||
filesystem.
|
filesystem.
|
||||||
|
|
||||||
* An ``'AF_PIPE'`` address is a string of the form
|
* An ``'AF_PIPE'`` address is a string of the form
|
||||||
``r'\\\\.\\pipe\\PipeName'``. To use :func:`Client` to connect to a named
|
:samp:`r'\\\\.\\pipe\\{PipeName}'`. To use :func:`Client` to connect to a named
|
||||||
pipe on a remote computer called ServerName* one should use an address of the
|
pipe on a remote computer called ServerName* one should use an address of the
|
||||||
form ``r'\\\\ServerName\\pipe\\PipeName'`` instead.
|
form :samp:`r'\\\\{ServerName}\\pipe\\{PipeName}'`` instead.
|
||||||
|
|
||||||
Note that any string beginning with two backslashes is assumed by default to be
|
Note that any string beginning with two backslashes is assumed by default to be
|
||||||
an ``'AF_PIPE'`` address rather than an ``'AF_UNIX'`` address.
|
an ``'AF_PIPE'`` address rather than an ``'AF_UNIX'`` address.
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
:mod:`new` --- Creation of runtime internal objects
|
:mod:`new` --- Creation of runtime internal objects
|
||||||
===================================================
|
===================================================
|
||||||
|
|
||||||
|
@ -7,7 +6,8 @@
|
||||||
:deprecated:
|
:deprecated:
|
||||||
|
|
||||||
.. deprecated:: 2.6
|
.. deprecated:: 2.6
|
||||||
The :mod:`new` module has been removed in Python 3.0.
|
The :mod:`new` module has been removed in Python 3.0. Use the :mod:`types`
|
||||||
|
module's classes instead.
|
||||||
|
|
||||||
.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
|
.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,13 @@ it contains the path separator for your operating system, such as a slash in
|
||||||
Unix), and refers to an existing Python source file, then documentation is
|
Unix), and refers to an existing Python source file, then documentation is
|
||||||
produced for that file.
|
produced for that file.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
In order to find objects and their documentation, :mod:`pydoc` imports the
|
||||||
|
module(s) to be documented. Therefore, any code on module level will be
|
||||||
|
executed on that occasion. Use an ``if __name__ == '__main__':`` guard to
|
||||||
|
only execute code when a file is invoked as a script and not just imported.
|
||||||
|
|
||||||
Specifying a :option:`-w` flag before the argument will cause HTML documentation
|
Specifying a :option:`-w` flag before the argument will cause HTML documentation
|
||||||
to be written out to a file in the current directory, instead of displaying text
|
to be written out to a file in the current directory, instead of displaying text
|
||||||
on the console.
|
on the console.
|
||||||
|
|
|
@ -448,7 +448,7 @@ This is the server side::
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
HOST, PORT = "localhost", 9999
|
HOST, PORT = "localhost", 9999
|
||||||
server = SocketServer.UDPServer((HOST, PORT), BaseUDPRequestHandler)
|
server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
|
|
||||||
This is the client side::
|
This is the client side::
|
||||||
|
|
|
@ -391,23 +391,23 @@ OpenerDirector Objects
|
||||||
|
|
||||||
.. method:: OpenerDirector.add_handler(handler)
|
.. method:: OpenerDirector.add_handler(handler)
|
||||||
|
|
||||||
*handler* should be an instance of :class:`BaseHandler`. The following methods
|
*handler* should be an instance of :class:`BaseHandler`. The following
|
||||||
are searched, and added to the possible chains (note that HTTP errors are a
|
methods are searched, and added to the possible chains (note that HTTP errors
|
||||||
special case).
|
are a special case).
|
||||||
|
|
||||||
* :meth:`protocol_open` --- signal that the handler knows how to open *protocol*
|
* :samp:`{protocol}_open` --- signal that the handler knows how to open
|
||||||
URLs.
|
*protocol* URLs.
|
||||||
|
|
||||||
* :meth:`http_error_type` --- signal that the handler knows how to handle HTTP
|
* :samp:`http_error_{type}` --- signal that the handler knows how to handle
|
||||||
errors with HTTP error code *type*.
|
HTTP errors with HTTP error code *type*.
|
||||||
|
|
||||||
* :meth:`protocol_error` --- signal that the handler knows how to handle errors
|
* :samp:`{protocol}_error` --- signal that the handler knows how to handle
|
||||||
from (non-\ ``http``) *protocol*.
|
errors from (non-\ ``http``) *protocol*.
|
||||||
|
|
||||||
* :meth:`protocol_request` --- signal that the handler knows how to pre-process
|
* :samp:`{protocol}_request` --- signal that the handler knows how to
|
||||||
*protocol* requests.
|
pre-process *protocol* requests.
|
||||||
|
|
||||||
* :meth:`protocol_response` --- signal that the handler knows how to
|
* :samp:`{protocol}_response` --- signal that the handler knows how to
|
||||||
post-process *protocol* responses.
|
post-process *protocol* responses.
|
||||||
|
|
||||||
|
|
||||||
|
@ -441,24 +441,24 @@ OpenerDirector objects open URLs in three stages:
|
||||||
The order in which these methods are called within each stage is determined by
|
The order in which these methods are called within each stage is determined by
|
||||||
sorting the handler instances.
|
sorting the handler instances.
|
||||||
|
|
||||||
#. Every handler with a method named like :meth:`protocol_request` has that
|
#. Every handler with a method named like :samp:`{protocol}_request` has that
|
||||||
method called to pre-process the request.
|
method called to pre-process the request.
|
||||||
|
|
||||||
#. Handlers with a method named like :meth:`protocol_open` are called to handle
|
#. Handlers with a method named like :samp:`{protocol}_open` are called to handle
|
||||||
the request. This stage ends when a handler either returns a non-\ :const:`None`
|
the request. This stage ends when a handler either returns a non-\ :const:`None`
|
||||||
value (ie. a response), or raises an exception (usually :exc:`URLError`).
|
value (ie. a response), or raises an exception (usually :exc:`URLError`).
|
||||||
Exceptions are allowed to propagate.
|
Exceptions are allowed to propagate.
|
||||||
|
|
||||||
In fact, the above algorithm is first tried for methods named
|
In fact, the above algorithm is first tried for methods named
|
||||||
:meth:`default_open`. If all such methods return :const:`None`, the algorithm
|
:meth:`default_open`. If all such methods return :const:`None`, the
|
||||||
is repeated for methods named like :meth:`protocol_open`. If all such methods
|
algorithm is repeated for methods named like :samp:`{protocol}_open`. If all
|
||||||
return :const:`None`, the algorithm is repeated for methods named
|
such methods return :const:`None`, the algorithm is repeated for methods
|
||||||
:meth:`unknown_open`.
|
named :meth:`unknown_open`.
|
||||||
|
|
||||||
Note that the implementation of these methods may involve calls of the parent
|
Note that the implementation of these methods may involve calls of the parent
|
||||||
:class:`OpenerDirector` instance's :meth:`.open` and :meth:`.error` methods.
|
:class:`OpenerDirector` instance's :meth:`.open` and :meth:`.error` methods.
|
||||||
|
|
||||||
#. Every handler with a method named like :meth:`protocol_response` has that
|
#. Every handler with a method named like :samp:`{protocol}_response` has that
|
||||||
method called to post-process the response.
|
method called to post-process the response.
|
||||||
|
|
||||||
|
|
||||||
|
@ -514,8 +514,10 @@ The following members and methods should only be used by classes derived from
|
||||||
.. method:: BaseHandler.protocol_open(req)
|
.. method:: BaseHandler.protocol_open(req)
|
||||||
:noindex:
|
:noindex:
|
||||||
|
|
||||||
|
("protocol" is to be replaced by the protocol name.)
|
||||||
|
|
||||||
This method is *not* defined in :class:`BaseHandler`, but subclasses should
|
This method is *not* defined in :class:`BaseHandler`, but subclasses should
|
||||||
define it if they want to handle URLs with the given protocol.
|
define it if they want to handle URLs with the given *protocol*.
|
||||||
|
|
||||||
This method, if defined, will be called by the parent :class:`OpenerDirector`.
|
This method, if defined, will be called by the parent :class:`OpenerDirector`.
|
||||||
Return values should be the same as for :meth:`default_open`.
|
Return values should be the same as for :meth:`default_open`.
|
||||||
|
@ -563,8 +565,10 @@ The following members and methods should only be used by classes derived from
|
||||||
.. method:: BaseHandler.protocol_request(req)
|
.. method:: BaseHandler.protocol_request(req)
|
||||||
:noindex:
|
:noindex:
|
||||||
|
|
||||||
|
("protocol" is to be replaced by the protocol name.)
|
||||||
|
|
||||||
This method is *not* defined in :class:`BaseHandler`, but subclasses should
|
This method is *not* defined in :class:`BaseHandler`, but subclasses should
|
||||||
define it if they want to pre-process requests of the given protocol.
|
define it if they want to pre-process requests of the given *protocol*.
|
||||||
|
|
||||||
This method, if defined, will be called by the parent :class:`OpenerDirector`.
|
This method, if defined, will be called by the parent :class:`OpenerDirector`.
|
||||||
*req* will be a :class:`Request` object. The return value should be a
|
*req* will be a :class:`Request` object. The return value should be a
|
||||||
|
@ -574,8 +578,10 @@ The following members and methods should only be used by classes derived from
|
||||||
.. method:: BaseHandler.protocol_response(req, response)
|
.. method:: BaseHandler.protocol_response(req, response)
|
||||||
:noindex:
|
:noindex:
|
||||||
|
|
||||||
|
("protocol" is to be replaced by the protocol name.)
|
||||||
|
|
||||||
This method is *not* defined in :class:`BaseHandler`, but subclasses should
|
This method is *not* defined in :class:`BaseHandler`, but subclasses should
|
||||||
define it if they want to post-process responses of the given protocol.
|
define it if they want to post-process responses of the given *protocol*.
|
||||||
|
|
||||||
This method, if defined, will be called by the parent :class:`OpenerDirector`.
|
This method, if defined, will be called by the parent :class:`OpenerDirector`.
|
||||||
*req* will be a :class:`Request` object. *response* will be an object
|
*req* will be a :class:`Request` object. *response* will be an object
|
||||||
|
@ -660,7 +666,9 @@ ProxyHandler Objects
|
||||||
.. method:: ProxyHandler.protocol_open(request)
|
.. method:: ProxyHandler.protocol_open(request)
|
||||||
:noindex:
|
:noindex:
|
||||||
|
|
||||||
The :class:`ProxyHandler` will have a method :meth:`protocol_open` for every
|
("protocol" is to be replaced by the protocol name.)
|
||||||
|
|
||||||
|
The :class:`ProxyHandler` will have a method :samp:`{protocol}_open` for every
|
||||||
*protocol* which has a proxy in the *proxies* dictionary given in the
|
*protocol* which has a proxy in the *proxies* dictionary given in the
|
||||||
constructor. The method will modify requests to go through the proxy, by
|
constructor. The method will modify requests to go through the proxy, by
|
||||||
calling ``request.set_proxy()``, and call the next handler in the chain to
|
calling ``request.set_proxy()``, and call the next handler in the chain to
|
||||||
|
@ -865,9 +873,10 @@ HTTPErrorProcessor Objects
|
||||||
For 200 error codes, the response object is returned immediately.
|
For 200 error codes, the response object is returned immediately.
|
||||||
|
|
||||||
For non-200 error codes, this simply passes the job on to the
|
For non-200 error codes, this simply passes the job on to the
|
||||||
:meth:`protocol_error_code` handler methods, via :meth:`OpenerDirector.error`.
|
:samp:`{protocol}_error_code` handler methods, via
|
||||||
Eventually, :class:`urllib2.HTTPDefaultErrorHandler` will raise an
|
:meth:`OpenerDirector.error`. Eventually,
|
||||||
:exc:`HTTPError` if no other handler handles the error.
|
:class:`urllib2.HTTPDefaultErrorHandler` will raise an :exc:`HTTPError` if no
|
||||||
|
other handler handles the error.
|
||||||
|
|
||||||
|
|
||||||
.. _urllib2-examples:
|
.. _urllib2-examples:
|
||||||
|
|
|
@ -172,7 +172,7 @@ Here are some simple examples::
|
||||||
Browser Controller Objects
|
Browser Controller Objects
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Browser controllers provide two methods which parallel two of the module-level
|
Browser controllers provide these methods which parallel two of the module-level
|
||||||
convenience functions:
|
convenience functions:
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -30,8 +30,9 @@ provided by Windows platforms. It includes functions and several constants.
|
||||||
Call the underlying :cfunc:`PlaySound` function from the Platform API. The
|
Call the underlying :cfunc:`PlaySound` function from the Platform API. The
|
||||||
*sound* parameter may be a filename, audio data as a string, or ``None``. Its
|
*sound* parameter may be a filename, audio data as a string, or ``None``. Its
|
||||||
interpretation depends on the value of *flags*, which can be a bitwise ORed
|
interpretation depends on the value of *flags*, which can be a bitwise ORed
|
||||||
combination of the constants described below. If the system indicates an error,
|
combination of the constants described below. If the *sound* parameter is
|
||||||
:exc:`RuntimeError` is raised.
|
``None``, any currently playing waveform sound is stopped. If the system
|
||||||
|
indicates an error, :exc:`RuntimeError` is raised.
|
||||||
|
|
||||||
|
|
||||||
.. function:: MessageBeep([type=MB_OK])
|
.. function:: MessageBeep([type=MB_OK])
|
||||||
|
@ -108,6 +109,10 @@ provided by Windows platforms. It includes functions and several constants.
|
||||||
|
|
||||||
Stop playing all instances of the specified sound.
|
Stop playing all instances of the specified sound.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
This flag is not supported on modern Windows platforms.
|
||||||
|
|
||||||
|
|
||||||
.. data:: SND_ASYNC
|
.. data:: SND_ASYNC
|
||||||
|
|
||||||
|
|
|
@ -94,6 +94,16 @@ Functions
|
||||||
*events* is a list of events to report back. If omitted, only "end" events are
|
*events* is a list of events to report back. If omitted, only "end" events are
|
||||||
reported. Returns an :term:`iterator` providing ``(event, elem)`` pairs.
|
reported. Returns an :term:`iterator` providing ``(event, elem)`` pairs.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
:func:`iterparse` only guarantees that it has seen the ">"
|
||||||
|
character of a starting tag when it emits a "start" event, so the
|
||||||
|
attributes are defined, but the contents of the text and tail attributes
|
||||||
|
are undefined at that point. The same applies to the element children;
|
||||||
|
they may or may not be present.
|
||||||
|
|
||||||
|
If you need a fully populated element, look for "end" events instead.
|
||||||
|
|
||||||
|
|
||||||
.. function:: parse(source[, parser])
|
.. function:: parse(source[, parser])
|
||||||
|
|
||||||
|
|
|
@ -153,6 +153,7 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
|
||||||
# define PyUnicode_AsUnicode PyUnicodeUCS2_AsUnicode
|
# define PyUnicode_AsUnicode PyUnicodeUCS2_AsUnicode
|
||||||
# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS2_AsUnicodeEscapeString
|
# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS2_AsUnicodeEscapeString
|
||||||
# define PyUnicode_AsWideChar PyUnicodeUCS2_AsWideChar
|
# define PyUnicode_AsWideChar PyUnicodeUCS2_AsWideChar
|
||||||
|
# define PyUnicode_ClearFreeList PyUnicodeUCS2_ClearFreelist
|
||||||
# define PyUnicode_Compare PyUnicodeUCS2_Compare
|
# define PyUnicode_Compare PyUnicodeUCS2_Compare
|
||||||
# define PyUnicode_Concat PyUnicodeUCS2_Concat
|
# define PyUnicode_Concat PyUnicodeUCS2_Concat
|
||||||
# define PyUnicode_Contains PyUnicodeUCS2_Contains
|
# define PyUnicode_Contains PyUnicodeUCS2_Contains
|
||||||
|
@ -182,13 +183,13 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
|
||||||
# define PyUnicode_Find PyUnicodeUCS2_Find
|
# define PyUnicode_Find PyUnicodeUCS2_Find
|
||||||
# define PyUnicode_Format PyUnicodeUCS2_Format
|
# define PyUnicode_Format PyUnicodeUCS2_Format
|
||||||
# define PyUnicode_FromEncodedObject PyUnicodeUCS2_FromEncodedObject
|
# define PyUnicode_FromEncodedObject PyUnicodeUCS2_FromEncodedObject
|
||||||
|
# define PyUnicode_FromFormat PyUnicodeUCS2_FromFormat
|
||||||
|
# define PyUnicode_FromFormatV PyUnicodeUCS2_FromFormatV
|
||||||
# define PyUnicode_FromObject PyUnicodeUCS2_FromObject
|
# define PyUnicode_FromObject PyUnicodeUCS2_FromObject
|
||||||
# define PyUnicode_FromOrdinal PyUnicodeUCS2_FromOrdinal
|
# define PyUnicode_FromOrdinal PyUnicodeUCS2_FromOrdinal
|
||||||
# define PyUnicode_FromUnicode PyUnicodeUCS2_FromUnicode
|
|
||||||
# define PyUnicode_FromString PyUnicodeUCS2_FromString
|
# define PyUnicode_FromString PyUnicodeUCS2_FromString
|
||||||
# define PyUnicode_FromStringAndSize PyUnicodeUCS2_FromStringAndSize
|
# define PyUnicode_FromStringAndSize PyUnicodeUCS2_FromStringAndSize
|
||||||
# define PyUnicode_FromFormatV PyUnicodeUCS2_FromFormatV
|
# define PyUnicode_FromUnicode PyUnicodeUCS2_FromUnicode
|
||||||
# define PyUnicode_FromFormat PyUnicodeUCS2_FromFormat
|
|
||||||
# define PyUnicode_FromWideChar PyUnicodeUCS2_FromWideChar
|
# define PyUnicode_FromWideChar PyUnicodeUCS2_FromWideChar
|
||||||
# define PyUnicode_GetDefaultEncoding PyUnicodeUCS2_GetDefaultEncoding
|
# define PyUnicode_GetDefaultEncoding PyUnicodeUCS2_GetDefaultEncoding
|
||||||
# define PyUnicode_GetMax PyUnicodeUCS2_GetMax
|
# define PyUnicode_GetMax PyUnicodeUCS2_GetMax
|
||||||
|
@ -209,7 +210,6 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
|
||||||
# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS2_AsDefaultEncodedString
|
# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS2_AsDefaultEncodedString
|
||||||
# define _PyUnicode_Fini _PyUnicodeUCS2_Fini
|
# define _PyUnicode_Fini _PyUnicodeUCS2_Fini
|
||||||
# define _PyUnicode_Init _PyUnicodeUCS2_Init
|
# define _PyUnicode_Init _PyUnicodeUCS2_Init
|
||||||
# define PyUnicode_ClearFreeList PyUnicodeUCS2_ClearFreelist
|
|
||||||
# define _PyUnicode_IsAlpha _PyUnicodeUCS2_IsAlpha
|
# define _PyUnicode_IsAlpha _PyUnicodeUCS2_IsAlpha
|
||||||
# define _PyUnicode_IsDecimalDigit _PyUnicodeUCS2_IsDecimalDigit
|
# define _PyUnicode_IsDecimalDigit _PyUnicodeUCS2_IsDecimalDigit
|
||||||
# define _PyUnicode_IsDigit _PyUnicodeUCS2_IsDigit
|
# define _PyUnicode_IsDigit _PyUnicodeUCS2_IsDigit
|
||||||
|
@ -240,6 +240,7 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
|
||||||
# define PyUnicode_AsUnicode PyUnicodeUCS4_AsUnicode
|
# define PyUnicode_AsUnicode PyUnicodeUCS4_AsUnicode
|
||||||
# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS4_AsUnicodeEscapeString
|
# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS4_AsUnicodeEscapeString
|
||||||
# define PyUnicode_AsWideChar PyUnicodeUCS4_AsWideChar
|
# define PyUnicode_AsWideChar PyUnicodeUCS4_AsWideChar
|
||||||
|
# define PyUnicode_ClearFreeList PyUnicodeUCS4_ClearFreelist
|
||||||
# define PyUnicode_Compare PyUnicodeUCS4_Compare
|
# define PyUnicode_Compare PyUnicodeUCS4_Compare
|
||||||
# define PyUnicode_Concat PyUnicodeUCS4_Concat
|
# define PyUnicode_Concat PyUnicodeUCS4_Concat
|
||||||
# define PyUnicode_Contains PyUnicodeUCS4_Contains
|
# define PyUnicode_Contains PyUnicodeUCS4_Contains
|
||||||
|
@ -269,13 +270,13 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
|
||||||
# define PyUnicode_Find PyUnicodeUCS4_Find
|
# define PyUnicode_Find PyUnicodeUCS4_Find
|
||||||
# define PyUnicode_Format PyUnicodeUCS4_Format
|
# define PyUnicode_Format PyUnicodeUCS4_Format
|
||||||
# define PyUnicode_FromEncodedObject PyUnicodeUCS4_FromEncodedObject
|
# define PyUnicode_FromEncodedObject PyUnicodeUCS4_FromEncodedObject
|
||||||
|
# define PyUnicode_FromFormat PyUnicodeUCS4_FromFormat
|
||||||
|
# define PyUnicode_FromFormatV PyUnicodeUCS4_FromFormatV
|
||||||
# define PyUnicode_FromObject PyUnicodeUCS4_FromObject
|
# define PyUnicode_FromObject PyUnicodeUCS4_FromObject
|
||||||
# define PyUnicode_FromOrdinal PyUnicodeUCS4_FromOrdinal
|
# define PyUnicode_FromOrdinal PyUnicodeUCS4_FromOrdinal
|
||||||
# define PyUnicode_FromUnicode PyUnicodeUCS4_FromUnicode
|
|
||||||
# define PyUnicode_FromString PyUnicodeUCS4_FromString
|
# define PyUnicode_FromString PyUnicodeUCS4_FromString
|
||||||
# define PyUnicode_FromStringAndSize PyUnicodeUCS4_FromStringAndSize
|
# define PyUnicode_FromStringAndSize PyUnicodeUCS4_FromStringAndSize
|
||||||
# define PyUnicode_FromFormatV PyUnicodeUCS4_FromFormatV
|
# define PyUnicode_FromUnicode PyUnicodeUCS4_FromUnicode
|
||||||
# define PyUnicode_FromFormat PyUnicodeUCS4_FromFormat
|
|
||||||
# define PyUnicode_FromWideChar PyUnicodeUCS4_FromWideChar
|
# define PyUnicode_FromWideChar PyUnicodeUCS4_FromWideChar
|
||||||
# define PyUnicode_GetDefaultEncoding PyUnicodeUCS4_GetDefaultEncoding
|
# define PyUnicode_GetDefaultEncoding PyUnicodeUCS4_GetDefaultEncoding
|
||||||
# define PyUnicode_GetMax PyUnicodeUCS4_GetMax
|
# define PyUnicode_GetMax PyUnicodeUCS4_GetMax
|
||||||
|
@ -296,7 +297,6 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
|
||||||
# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS4_AsDefaultEncodedString
|
# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS4_AsDefaultEncodedString
|
||||||
# define _PyUnicode_Fini _PyUnicodeUCS4_Fini
|
# define _PyUnicode_Fini _PyUnicodeUCS4_Fini
|
||||||
# define _PyUnicode_Init _PyUnicodeUCS4_Init
|
# define _PyUnicode_Init _PyUnicodeUCS4_Init
|
||||||
# define PyUnicode_ClearFreeList PyUnicodeUCS2_ClearFreelist
|
|
||||||
# define _PyUnicode_IsAlpha _PyUnicodeUCS4_IsAlpha
|
# define _PyUnicode_IsAlpha _PyUnicodeUCS4_IsAlpha
|
||||||
# define _PyUnicode_IsDecimalDigit _PyUnicodeUCS4_IsDecimalDigit
|
# define _PyUnicode_IsDecimalDigit _PyUnicodeUCS4_IsDecimalDigit
|
||||||
# define _PyUnicode_IsDigit _PyUnicodeUCS4_IsDigit
|
# define _PyUnicode_IsDigit _PyUnicodeUCS4_IsDigit
|
||||||
|
|
|
@ -140,9 +140,13 @@ def get_platform ():
|
||||||
# 'universal' instead of 'fat'.
|
# 'universal' instead of 'fat'.
|
||||||
|
|
||||||
machine = 'fat'
|
machine = 'fat'
|
||||||
|
cflags = get_config_vars().get('CFLAGS')
|
||||||
|
|
||||||
if '-arch x86_64' in get_config_vars().get('CFLAGS'):
|
if '-arch x86_64' in cflags:
|
||||||
machine = 'universal'
|
if '-arch i386' in cflags:
|
||||||
|
machine = 'universal'
|
||||||
|
else:
|
||||||
|
machine = 'fat64'
|
||||||
|
|
||||||
elif machine in ('PowerPC', 'Power_Macintosh'):
|
elif machine in ('PowerPC', 'Power_Macintosh'):
|
||||||
# Pick a sane name for the PPC architecture.
|
# Pick a sane name for the PPC architecture.
|
||||||
|
|
|
@ -158,9 +158,8 @@ def isgeneratorfunction(object):
|
||||||
Generator function objects provides same attributes as functions.
|
Generator function objects provides same attributes as functions.
|
||||||
|
|
||||||
See isfunction.__doc__ for attributes listing."""
|
See isfunction.__doc__ for attributes listing."""
|
||||||
if (isfunction(object) or ismethod(object)) and \
|
return bool((isfunction(object) or ismethod(object)) and
|
||||||
object.func_code.co_flags & CO_GENERATOR:
|
object.func_code.co_flags & CO_GENERATOR)
|
||||||
return True
|
|
||||||
|
|
||||||
def isgenerator(object):
|
def isgenerator(object):
|
||||||
"""Return true if the object is a generator.
|
"""Return true if the object is a generator.
|
||||||
|
|
57
Lib/pydoc.py
57
Lib/pydoc.py
|
@ -1574,6 +1574,42 @@ class Helper:
|
||||||
'with': ('with', 'CONTEXTMANAGERS EXCEPTIONS yield'),
|
'with': ('with', 'CONTEXTMANAGERS EXCEPTIONS yield'),
|
||||||
'yield': ('yield', ''),
|
'yield': ('yield', ''),
|
||||||
}
|
}
|
||||||
|
# Either add symbols to this dictionary or to the symbols dictionary
|
||||||
|
# directly: Whichever is easier. They are merged later.
|
||||||
|
_symbols_inverse = {
|
||||||
|
'STRINGS' : ("'", "'''", "r'", "u'", '"""', '"', 'r"', 'u"'),
|
||||||
|
'OPERATORS' : ('+', '-', '*', '**', '/', '//', '%', '<<', '>>', '&',
|
||||||
|
'|', '^', '~', '<', '>', '<=', '>=', '==', '!=', '<>'),
|
||||||
|
'COMPARISON' : ('<', '>', '<=', '>=', '==', '!=', '<>'),
|
||||||
|
'UNARY' : ('-', '~'),
|
||||||
|
'AUGMENTEDASSIGNMENT' : ('+=', '-=', '*=', '/=', '%=', '&=', '|=',
|
||||||
|
'^=', '<<=', '>>=', '**=', '//='),
|
||||||
|
'BITWISE' : ('<<', '>>', '&', '|', '^', '~'),
|
||||||
|
'COMPLEX' : ('j', 'J')
|
||||||
|
}
|
||||||
|
symbols = {
|
||||||
|
'%': 'OPERATORS FORMATTING',
|
||||||
|
'**': 'POWER',
|
||||||
|
',': 'TUPLES LISTS FUNCTIONS',
|
||||||
|
'.': 'ATTRIBUTES FLOAT MODULES OBJECTS',
|
||||||
|
'...': 'ELLIPSIS',
|
||||||
|
':': 'SLICINGS DICTIONARYLITERALS',
|
||||||
|
'@': 'def class',
|
||||||
|
'\\': 'STRINGS',
|
||||||
|
'_': 'PRIVATENAMES',
|
||||||
|
'__': 'PRIVATENAMES SPECIALMETHODS',
|
||||||
|
'`': 'BACKQUOTES',
|
||||||
|
'(': 'TUPLES FUNCTIONS CALLS',
|
||||||
|
')': 'TUPLES FUNCTIONS CALLS',
|
||||||
|
'[': 'LISTS SUBSCRIPTS SLICINGS',
|
||||||
|
']': 'LISTS SUBSCRIPTS SLICINGS'
|
||||||
|
}
|
||||||
|
for topic, symbols_ in _symbols_inverse.iteritems():
|
||||||
|
for symbol in symbols_:
|
||||||
|
topics = symbols.get(symbol, topic)
|
||||||
|
if topic not in topics:
|
||||||
|
topics = topics + ' ' + topic
|
||||||
|
symbols[symbol] = topics
|
||||||
|
|
||||||
topics = {
|
topics = {
|
||||||
'TYPES': ('types', 'STRINGS UNICODE NUMBERS SEQUENCES MAPPINGS '
|
'TYPES': ('types', 'STRINGS UNICODE NUMBERS SEQUENCES MAPPINGS '
|
||||||
|
@ -1717,10 +1753,12 @@ has the same effect as typing a particular string at the help> prompt.
|
||||||
if type(request) is type(''):
|
if type(request) is type(''):
|
||||||
if request == 'help': self.intro()
|
if request == 'help': self.intro()
|
||||||
elif request == 'keywords': self.listkeywords()
|
elif request == 'keywords': self.listkeywords()
|
||||||
|
elif request == 'symbols': self.listsymbols()
|
||||||
elif request == 'topics': self.listtopics()
|
elif request == 'topics': self.listtopics()
|
||||||
elif request == 'modules': self.listmodules()
|
elif request == 'modules': self.listmodules()
|
||||||
elif request[:8] == 'modules ':
|
elif request[:8] == 'modules ':
|
||||||
self.listmodules(split(request)[1])
|
self.listmodules(split(request)[1])
|
||||||
|
elif request in self.symbols: self.showsymbol(request)
|
||||||
elif request in self.keywords: self.showtopic(request)
|
elif request in self.keywords: self.showtopic(request)
|
||||||
elif request in self.topics: self.showtopic(request)
|
elif request in self.topics: self.showtopic(request)
|
||||||
elif request: doc(request, 'Help on %s:')
|
elif request: doc(request, 'Help on %s:')
|
||||||
|
@ -1766,6 +1804,14 @@ Here is a list of the Python keywords. Enter any keyword to get more help.
|
||||||
''')
|
''')
|
||||||
self.list(self.keywords.keys())
|
self.list(self.keywords.keys())
|
||||||
|
|
||||||
|
def listsymbols(self):
|
||||||
|
self.output.write('''
|
||||||
|
Here is a list of the punctuation symbols which Python assigns special meaning
|
||||||
|
to. Enter any symbol to get more help.
|
||||||
|
|
||||||
|
''')
|
||||||
|
self.list(self.symbols.keys())
|
||||||
|
|
||||||
def listtopics(self):
|
def listtopics(self):
|
||||||
self.output.write('''
|
self.output.write('''
|
||||||
Here is a list of available topics. Enter any topic name to get more help.
|
Here is a list of available topics. Enter any topic name to get more help.
|
||||||
|
@ -1773,7 +1819,7 @@ Here is a list of available topics. Enter any topic name to get more help.
|
||||||
''')
|
''')
|
||||||
self.list(self.topics.keys())
|
self.list(self.topics.keys())
|
||||||
|
|
||||||
def showtopic(self, topic):
|
def showtopic(self, topic, more_xrefs=''):
|
||||||
try:
|
try:
|
||||||
import pydoc_topics
|
import pydoc_topics
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
@ -1787,7 +1833,7 @@ module "pydoc_topics" could not be found.
|
||||||
self.output.write('no documentation found for %s\n' % repr(topic))
|
self.output.write('no documentation found for %s\n' % repr(topic))
|
||||||
return
|
return
|
||||||
if type(target) is type(''):
|
if type(target) is type(''):
|
||||||
return self.showtopic(target)
|
return self.showtopic(target, more_xrefs)
|
||||||
|
|
||||||
label, xrefs = target
|
label, xrefs = target
|
||||||
try:
|
try:
|
||||||
|
@ -1796,6 +1842,8 @@ module "pydoc_topics" could not be found.
|
||||||
self.output.write('no documentation found for %s\n' % repr(topic))
|
self.output.write('no documentation found for %s\n' % repr(topic))
|
||||||
return
|
return
|
||||||
pager(strip(doc) + '\n')
|
pager(strip(doc) + '\n')
|
||||||
|
if more_xrefs:
|
||||||
|
xrefs = (xrefs or '') + ' ' + more_xrefs
|
||||||
if xrefs:
|
if xrefs:
|
||||||
import StringIO, formatter
|
import StringIO, formatter
|
||||||
buffer = StringIO.StringIO()
|
buffer = StringIO.StringIO()
|
||||||
|
@ -1803,6 +1851,11 @@ module "pydoc_topics" could not be found.
|
||||||
'Related help topics: ' + join(split(xrefs), ', ') + '\n')
|
'Related help topics: ' + join(split(xrefs), ', ') + '\n')
|
||||||
self.output.write('\n%s\n' % buffer.getvalue())
|
self.output.write('\n%s\n' % buffer.getvalue())
|
||||||
|
|
||||||
|
def showsymbol(self, symbol):
|
||||||
|
target = self.symbols[symbol]
|
||||||
|
topic, _, xrefs = target.partition(' ')
|
||||||
|
self.showtopic(topic, xrefs)
|
||||||
|
|
||||||
def listmodules(self, key=''):
|
def listmodules(self, key=''):
|
||||||
if key:
|
if key:
|
||||||
self.output.write('''
|
self.output.write('''
|
||||||
|
|
|
@ -145,7 +145,8 @@ def sub(pattern, repl, string, count=0):
|
||||||
"""Return the string obtained by replacing the leftmost
|
"""Return the string obtained by replacing the leftmost
|
||||||
non-overlapping occurrences of the pattern in string by the
|
non-overlapping occurrences of the pattern in string by the
|
||||||
replacement repl. repl can be either a string or a callable;
|
replacement repl. repl can be either a string or a callable;
|
||||||
if a callable, it's passed the match object and must return
|
if a string, backslash escapes in it are processed. If it is
|
||||||
|
a callable, it's passed the match object and must return
|
||||||
a replacement string to be used."""
|
a replacement string to be used."""
|
||||||
return _compile(pattern, 0).sub(repl, string, count)
|
return _compile(pattern, 0).sub(repl, string, count)
|
||||||
|
|
||||||
|
@ -155,7 +156,8 @@ def subn(pattern, repl, string, count=0):
|
||||||
non-overlapping occurrences of the pattern in the source
|
non-overlapping occurrences of the pattern in the source
|
||||||
string by the replacement repl. number is the number of
|
string by the replacement repl. number is the number of
|
||||||
substitutions that were made. repl can be either a string or a
|
substitutions that were made. repl can be either a string or a
|
||||||
callable; if a callable, it's passed the match object and must
|
callable; if a string, backslash escapes in it are processed.
|
||||||
|
If it is a callable, it's passed the match object and must
|
||||||
return a replacement string to be used."""
|
return a replacement string to be used."""
|
||||||
return _compile(pattern, 0).subn(repl, string, count)
|
return _compile(pattern, 0).subn(repl, string, count)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
from collections import deque
|
from collections import deque
|
||||||
import unittest
|
import unittest
|
||||||
from test import test_support, seq_tests
|
from test import test_support, seq_tests
|
||||||
from weakref import proxy
|
import gc
|
||||||
|
import weakref
|
||||||
import copy
|
import copy
|
||||||
import cPickle as pickle
|
import cPickle as pickle
|
||||||
import random
|
import random
|
||||||
|
@ -418,6 +419,22 @@ class TestBasic(unittest.TestCase):
|
||||||
d.append(1)
|
d.append(1)
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
||||||
|
def test_container_iterator(self):
|
||||||
|
# Bug # XXX: tp_traverse was not implemented for deque iterator objects
|
||||||
|
class C(object):
|
||||||
|
pass
|
||||||
|
for i in range(2):
|
||||||
|
obj = C()
|
||||||
|
ref = weakref.ref(obj)
|
||||||
|
if i == 0:
|
||||||
|
container = deque([obj, 1])
|
||||||
|
else:
|
||||||
|
container = reversed(deque([obj, 1]))
|
||||||
|
obj.x = iter(container)
|
||||||
|
del obj, container
|
||||||
|
gc.collect()
|
||||||
|
self.assert_(ref() is None, "Cycle was not collected")
|
||||||
|
|
||||||
class TestVariousIteratorArgs(unittest.TestCase):
|
class TestVariousIteratorArgs(unittest.TestCase):
|
||||||
|
|
||||||
def test_constructor(self):
|
def test_constructor(self):
|
||||||
|
@ -528,7 +545,7 @@ class TestSubclass(unittest.TestCase):
|
||||||
|
|
||||||
def test_weakref(self):
|
def test_weakref(self):
|
||||||
d = deque('gallahad')
|
d = deque('gallahad')
|
||||||
p = proxy(d)
|
p = weakref.proxy(d)
|
||||||
self.assertEqual(str(p), str(d))
|
self.assertEqual(str(p), str(d))
|
||||||
d = None
|
d = None
|
||||||
self.assertRaises(ReferenceError, str, p)
|
self.assertRaises(ReferenceError, str, p)
|
||||||
|
|
|
@ -2,6 +2,7 @@ import unittest
|
||||||
from test import test_support
|
from test import test_support
|
||||||
|
|
||||||
import UserDict, random, string
|
import UserDict, random, string
|
||||||
|
import gc, weakref
|
||||||
|
|
||||||
|
|
||||||
class DictTest(unittest.TestCase):
|
class DictTest(unittest.TestCase):
|
||||||
|
@ -554,6 +555,19 @@ class DictTest(unittest.TestCase):
|
||||||
pass
|
pass
|
||||||
d = {}
|
d = {}
|
||||||
|
|
||||||
|
def test_container_iterator(self):
|
||||||
|
# Bug # XXX: tp_traverse was not implemented for dictiter objects
|
||||||
|
class C(object):
|
||||||
|
pass
|
||||||
|
iterators = (dict.iteritems, dict.itervalues, dict.iterkeys)
|
||||||
|
for i in iterators:
|
||||||
|
obj = C()
|
||||||
|
ref = weakref.ref(obj)
|
||||||
|
container = {obj: 1}
|
||||||
|
obj.x = i(container)
|
||||||
|
del obj, container
|
||||||
|
gc.collect()
|
||||||
|
self.assert_(ref() is None, "Cycle was not collected")
|
||||||
|
|
||||||
|
|
||||||
from test import mapping_tests
|
from test import mapping_tests
|
||||||
|
|
|
@ -125,6 +125,19 @@ class AutoFileTests(unittest.TestCase):
|
||||||
|
|
||||||
class OtherFileTests(unittest.TestCase):
|
class OtherFileTests(unittest.TestCase):
|
||||||
|
|
||||||
|
def testOpenDir(self):
|
||||||
|
this_dir = os.path.dirname(__file__)
|
||||||
|
for mode in (None, "w"):
|
||||||
|
try:
|
||||||
|
if mode:
|
||||||
|
f = open(this_dir, mode)
|
||||||
|
else:
|
||||||
|
f = open(this_dir)
|
||||||
|
except IOError as e:
|
||||||
|
self.assertEqual(e.filename, this_dir)
|
||||||
|
else:
|
||||||
|
self.fail("opening a directory didn't raise an IOError")
|
||||||
|
|
||||||
def testModeStrings(self):
|
def testModeStrings(self):
|
||||||
# check invalid mode strings
|
# check invalid mode strings
|
||||||
for mode in ("", "aU", "wU+"):
|
for mode in ("", "aU", "wU+"):
|
||||||
|
|
|
@ -109,6 +109,7 @@ class AutoFileTests(unittest.TestCase):
|
||||||
_fileio._FileIO('.', 'r')
|
_fileio._FileIO('.', 'r')
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
self.assertNotEqual(e.errno, 0)
|
self.assertNotEqual(e.errno, 0)
|
||||||
|
self.assertEqual(e.filename, ".")
|
||||||
else:
|
else:
|
||||||
self.fail("Should have raised IOError")
|
self.fail("Should have raised IOError")
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import unittest
|
import unittest
|
||||||
from test import test_support
|
from test import test_support
|
||||||
from weakref import proxy
|
import gc
|
||||||
|
import weakref
|
||||||
import operator
|
import operator
|
||||||
import copy
|
import copy
|
||||||
import pickle
|
import pickle
|
||||||
|
@ -322,6 +323,18 @@ class TestJointOps(unittest.TestCase):
|
||||||
self.assertEqual(sum(elem.hash_count for elem in d), n)
|
self.assertEqual(sum(elem.hash_count for elem in d), n)
|
||||||
self.assertEqual(d3, dict.fromkeys(d, 123))
|
self.assertEqual(d3, dict.fromkeys(d, 123))
|
||||||
|
|
||||||
|
def test_container_iterator(self):
|
||||||
|
# Bug # XXX: tp_traverse was not implemented for set iterator object
|
||||||
|
class C(object):
|
||||||
|
pass
|
||||||
|
obj = C()
|
||||||
|
ref = weakref.ref(obj)
|
||||||
|
container = set([obj, 1])
|
||||||
|
obj.x = iter(container)
|
||||||
|
del obj, container
|
||||||
|
gc.collect()
|
||||||
|
self.assert_(ref() is None, "Cycle was not collected")
|
||||||
|
|
||||||
class TestSet(TestJointOps):
|
class TestSet(TestJointOps):
|
||||||
thetype = set
|
thetype = set
|
||||||
|
|
||||||
|
@ -538,7 +551,7 @@ class TestSet(TestJointOps):
|
||||||
|
|
||||||
def test_weakref(self):
|
def test_weakref(self):
|
||||||
s = self.thetype('gallahad')
|
s = self.thetype('gallahad')
|
||||||
p = proxy(s)
|
p = weakref.proxy(s)
|
||||||
self.assertEqual(str(p), str(s))
|
self.assertEqual(str(p), str(s))
|
||||||
s = None
|
s = None
|
||||||
self.assertRaises(ReferenceError, str, p)
|
self.assertRaises(ReferenceError, str, p)
|
||||||
|
|
|
@ -2,6 +2,8 @@ import array
|
||||||
import unittest
|
import unittest
|
||||||
import struct
|
import struct
|
||||||
import warnings
|
import warnings
|
||||||
|
warnings.filterwarnings("ignore", "struct integer overflow masking is deprecated",
|
||||||
|
DeprecationWarning)
|
||||||
|
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from test.test_support import TestFailed, verbose, run_unittest
|
from test.test_support import TestFailed, verbose, run_unittest
|
||||||
|
@ -461,6 +463,11 @@ class StructTest(unittest.TestCase):
|
||||||
self.check_float_coerce(endian + fmt, 1.0)
|
self.check_float_coerce(endian + fmt, 1.0)
|
||||||
self.check_float_coerce(endian + fmt, 1.5)
|
self.check_float_coerce(endian + fmt, 1.5)
|
||||||
|
|
||||||
|
def test_issue4228(self):
|
||||||
|
# Packing a long may yield either 32 or 64 bits
|
||||||
|
x = struct.pack('L', -1)[:4]
|
||||||
|
self.assertEqual(x, '\xff'*4)
|
||||||
|
|
||||||
def test_unpack_from(self):
|
def test_unpack_from(self):
|
||||||
test_string = 'abcd01234'
|
test_string = 'abcd01234'
|
||||||
fmt = '4s'
|
fmt = '4s'
|
||||||
|
|
|
@ -84,7 +84,7 @@ 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 = (
|
wordsep_re = re.compile(
|
||||||
r'(\s+|' # any whitespace
|
r'(\s+|' # any whitespace
|
||||||
r'[^\s\w]*\w+[^0-9\W]-(?=\w+[^0-9\W])|' # 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
|
||||||
|
@ -93,7 +93,7 @@ class TextWrapper:
|
||||||
# "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 = r'(\s+)'
|
wordsep_simple_re = re.compile(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)
|
||||||
|
@ -124,6 +124,13 @@ class TextWrapper:
|
||||||
self.drop_whitespace = drop_whitespace
|
self.drop_whitespace = drop_whitespace
|
||||||
self.break_on_hyphens = break_on_hyphens
|
self.break_on_hyphens = break_on_hyphens
|
||||||
|
|
||||||
|
# recompile the regexes for Unicode mode -- done in this clumsy way for
|
||||||
|
# backwards compatibility because it's rather common to monkey-patch
|
||||||
|
# the TextWrapper class' wordsep_re attribute.
|
||||||
|
self.wordsep_re_uni = re.compile(self.wordsep_re.pattern, re.U)
|
||||||
|
self.wordsep_simple_re_uni = re.compile(
|
||||||
|
self.wordsep_simple_re.pattern, re.U)
|
||||||
|
|
||||||
|
|
||||||
# -- Private methods -----------------------------------------------
|
# -- Private methods -----------------------------------------------
|
||||||
# (possibly useful for subclasses to override)
|
# (possibly useful for subclasses to override)
|
||||||
|
@ -160,12 +167,17 @@ class TextWrapper:
|
||||||
'use', ' ', 'the', ' ', '-b', ' ', option!'
|
'use', ' ', 'the', ' ', '-b', ' ', option!'
|
||||||
otherwise.
|
otherwise.
|
||||||
"""
|
"""
|
||||||
flags = re.UNICODE if isinstance(text, unicode) else 0
|
if isinstance(text, unicode):
|
||||||
if self.break_on_hyphens:
|
if self.break_on_hyphens:
|
||||||
pat = self.wordsep_re
|
pat = self.wordsep_re_uni
|
||||||
|
else:
|
||||||
|
pat = self.wordsep_simple_re_uni
|
||||||
else:
|
else:
|
||||||
pat = self.wordsep_simple_re
|
if self.break_on_hyphens:
|
||||||
chunks = re.compile(pat, flags).split(text)
|
pat = self.wordsep_re
|
||||||
|
else:
|
||||||
|
pat = self.wordsep_simple_re
|
||||||
|
chunks = pat.split(text)
|
||||||
chunks = filter(None, chunks) # remove empty chunks
|
chunks = filter(None, chunks) # remove empty chunks
|
||||||
return chunks
|
return chunks
|
||||||
|
|
||||||
|
|
32
Misc/NEWS
32
Misc/NEWS
|
@ -12,9 +12,21 @@ What's New in Python 2.6.2
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #3680: Reference cycles created through a dict, set or deque iterator
|
||||||
|
did not get collected.
|
||||||
|
|
||||||
- Issue #4701: PyObject_Hash now implicitly calls PyType_Ready on types
|
- Issue #4701: PyObject_Hash now implicitly calls PyType_Ready on types
|
||||||
where the tp_hash and tp_dict slots are both NULL.
|
where the tp_hash and tp_dict slots are both NULL.
|
||||||
|
|
||||||
|
- Issue #4764: With io.open, IOError.filename is set when trying to open a
|
||||||
|
directory on POSIX systems.
|
||||||
|
|
||||||
|
- Issue #4764: IOError.filename is set when trying to open a directory on POSIX
|
||||||
|
systems.
|
||||||
|
|
||||||
|
- Issue #4759: None is now allowed as the first argument of
|
||||||
|
bytearray.translate(). It was always allowed for bytes.translate().
|
||||||
|
|
||||||
- Issue #4759: fix a segfault for bytearray.translate(x, None).
|
- Issue #4759: fix a segfault for bytearray.translate(x, None).
|
||||||
|
|
||||||
- Added test case to ensure attempts to read from a file opened for writing
|
- Added test case to ensure attempts to read from a file opened for writing
|
||||||
|
@ -138,9 +150,18 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #4795: inspect.isgeneratorfunction() returns False instead of None when
|
||||||
|
the function is not a generator.
|
||||||
|
|
||||||
- Issue #4702: Throwing a DistutilsPlatformError instead of IOError in case
|
- Issue #4702: Throwing a DistutilsPlatformError instead of IOError in case
|
||||||
no MSVC compiler is found under Windows. Original patch by Philip Jenvey.
|
no MSVC compiler is found under Windows. Original patch by Philip Jenvey.
|
||||||
|
|
||||||
|
- Issue #4739: Add pydoc help topics for symbols, so that e.g. help('@')
|
||||||
|
works as expected in the interactive environment.
|
||||||
|
|
||||||
|
- Issue #4756: zipfile.is_zipfile() now supports file-like objects. Patch by
|
||||||
|
Gabriel Genellina.
|
||||||
|
|
||||||
- Issue #4646: distutils was choking on empty options arg in the setup
|
- Issue #4646: distutils was choking on empty options arg in the setup
|
||||||
function. Original patch by Thomas Heller.
|
function. Original patch by Thomas Heller.
|
||||||
|
|
||||||
|
@ -206,9 +227,16 @@ Library
|
||||||
- Issue #4730: Fixed the cPickle module to handle correctly astral characters
|
- Issue #4730: Fixed the cPickle module to handle correctly astral characters
|
||||||
when protocol 0 is used.
|
when protocol 0 is used.
|
||||||
|
|
||||||
|
Tools/Demos
|
||||||
|
-----------
|
||||||
|
|
||||||
|
- Issue #4677: add two list comprehension tests to pybench.
|
||||||
|
|
||||||
Build
|
Build
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
- Issues #4728 and #4060: WORDS_BIGEDIAN is now correct in Universal builds.
|
||||||
|
|
||||||
- Issue #4389: Add icon to the uninstall entry in "add-and-remove-programs".
|
- Issue #4389: Add icon to the uninstall entry in "add-and-remove-programs".
|
||||||
|
|
||||||
- Issue #4289: Remove Cancel button from AdvancedDlg.
|
- Issue #4289: Remove Cancel button from AdvancedDlg.
|
||||||
|
@ -239,6 +267,10 @@ C-API
|
||||||
Extension Modules
|
Extension Modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #4228: Pack negative values the same way as 2.4 in struct's L format.
|
||||||
|
|
||||||
|
- Issue #1040026: Fix os.times result on systems where HZ is incorrect.
|
||||||
|
|
||||||
- Issues #3167, #3682: Fix test_math failures for log, log10 on Solaris,
|
- Issues #3167, #3682: Fix test_math failures for log, log10 on Solaris,
|
||||||
OpenBSD.
|
OpenBSD.
|
||||||
|
|
||||||
|
|
|
@ -958,7 +958,7 @@ deque_iter(dequeobject *deque)
|
||||||
{
|
{
|
||||||
dequeiterobject *it;
|
dequeiterobject *it;
|
||||||
|
|
||||||
it = PyObject_New(dequeiterobject, &dequeiter_type);
|
it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
|
||||||
if (it == NULL)
|
if (it == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
it->b = deque->leftblock;
|
it->b = deque->leftblock;
|
||||||
|
@ -967,14 +967,22 @@ deque_iter(dequeobject *deque)
|
||||||
it->deque = deque;
|
it->deque = deque;
|
||||||
it->state = deque->state;
|
it->state = deque->state;
|
||||||
it->counter = deque->len;
|
it->counter = deque->len;
|
||||||
|
_PyObject_GC_TRACK(it);
|
||||||
return (PyObject *)it;
|
return (PyObject *)it;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
|
||||||
|
{
|
||||||
|
Py_VISIT(dio->deque);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dequeiter_dealloc(dequeiterobject *dio)
|
dequeiter_dealloc(dequeiterobject *dio)
|
||||||
{
|
{
|
||||||
Py_XDECREF(dio->deque);
|
Py_XDECREF(dio->deque);
|
||||||
Py_TYPE(dio)->tp_free(dio);
|
PyObject_GC_Del(dio);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -1039,9 +1047,9 @@ static PyTypeObject dequeiter_type = {
|
||||||
PyObject_GenericGetAttr, /* tp_getattro */
|
PyObject_GenericGetAttr, /* tp_getattro */
|
||||||
0, /* tp_setattro */
|
0, /* tp_setattro */
|
||||||
0, /* tp_as_buffer */
|
0, /* tp_as_buffer */
|
||||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
|
||||||
0, /* tp_doc */
|
0, /* tp_doc */
|
||||||
0, /* tp_traverse */
|
(traverseproc)dequeiter_traverse, /* tp_traverse */
|
||||||
0, /* tp_clear */
|
0, /* tp_clear */
|
||||||
0, /* tp_richcompare */
|
0, /* tp_richcompare */
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
|
@ -1060,7 +1068,7 @@ deque_reviter(dequeobject *deque)
|
||||||
{
|
{
|
||||||
dequeiterobject *it;
|
dequeiterobject *it;
|
||||||
|
|
||||||
it = PyObject_New(dequeiterobject, &dequereviter_type);
|
it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
|
||||||
if (it == NULL)
|
if (it == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
it->b = deque->rightblock;
|
it->b = deque->rightblock;
|
||||||
|
@ -1069,6 +1077,7 @@ deque_reviter(dequeobject *deque)
|
||||||
it->deque = deque;
|
it->deque = deque;
|
||||||
it->state = deque->state;
|
it->state = deque->state;
|
||||||
it->counter = deque->len;
|
it->counter = deque->len;
|
||||||
|
_PyObject_GC_TRACK(it);
|
||||||
return (PyObject *)it;
|
return (PyObject *)it;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1121,9 +1130,9 @@ static PyTypeObject dequereviter_type = {
|
||||||
PyObject_GenericGetAttr, /* tp_getattro */
|
PyObject_GenericGetAttr, /* tp_getattro */
|
||||||
0, /* tp_setattro */
|
0, /* tp_setattro */
|
||||||
0, /* tp_as_buffer */
|
0, /* tp_as_buffer */
|
||||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
|
||||||
0, /* tp_doc */
|
0, /* tp_doc */
|
||||||
0, /* tp_traverse */
|
(traverseproc)dequeiter_traverse, /* tp_traverse */
|
||||||
0, /* tp_clear */
|
0, /* tp_clear */
|
||||||
0, /* tp_richcompare */
|
0, /* tp_richcompare */
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
|
|
|
@ -98,7 +98,7 @@ fileio_new(PyTypeObject *type, PyObject *args, PyObject *kews)
|
||||||
directories, so we need a check. */
|
directories, so we need a check. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dircheck(PyFileIOObject* self)
|
dircheck(PyFileIOObject* self, char *name)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR)
|
#if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR)
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
|
@ -109,8 +109,8 @@ dircheck(PyFileIOObject* self)
|
||||||
PyObject *exc;
|
PyObject *exc;
|
||||||
internal_close(self);
|
internal_close(self);
|
||||||
|
|
||||||
exc = PyObject_CallFunction(PyExc_IOError, "(is)",
|
exc = PyObject_CallFunction(PyExc_IOError, "(iss)",
|
||||||
EISDIR, msg);
|
EISDIR, msg, name);
|
||||||
PyErr_SetObject(PyExc_IOError, exc);
|
PyErr_SetObject(PyExc_IOError, exc);
|
||||||
Py_XDECREF(exc);
|
Py_XDECREF(exc);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -271,7 +271,7 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
|
||||||
#endif
|
#endif
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if(dircheck(self) < 0)
|
if(dircheck(self, name) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -663,7 +663,7 @@ np_int(char *p, PyObject *v, const formatdef *f)
|
||||||
return -1;
|
return -1;
|
||||||
#if (SIZEOF_LONG > SIZEOF_INT)
|
#if (SIZEOF_LONG > SIZEOF_INT)
|
||||||
if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX)))
|
if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX)))
|
||||||
return _range_error(f, 0);
|
RANGE_ERROR(x, f, 0, -1);
|
||||||
#endif
|
#endif
|
||||||
y = (int)x;
|
y = (int)x;
|
||||||
memcpy(p, (char *)&y, sizeof y);
|
memcpy(p, (char *)&y, sizeof y);
|
||||||
|
@ -675,12 +675,12 @@ np_uint(char *p, PyObject *v, const formatdef *f)
|
||||||
{
|
{
|
||||||
unsigned long x;
|
unsigned long x;
|
||||||
unsigned int y;
|
unsigned int y;
|
||||||
if (get_ulong(v, &x) < 0)
|
if (get_wrapped_ulong(v, &x) < 0)
|
||||||
return _range_error(f, 1);
|
return -1;
|
||||||
y = (unsigned int)x;
|
y = (unsigned int)x;
|
||||||
#if (SIZEOF_LONG > SIZEOF_INT)
|
#if (SIZEOF_LONG > SIZEOF_INT)
|
||||||
if (x > ((unsigned long)UINT_MAX))
|
if (x > ((unsigned long)UINT_MAX))
|
||||||
return _range_error(f, 1);
|
RANGE_ERROR(y, f, 1, -1);
|
||||||
#endif
|
#endif
|
||||||
memcpy(p, (char *)&y, sizeof y);
|
memcpy(p, (char *)&y, sizeof y);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -700,8 +700,8 @@ static int
|
||||||
np_ulong(char *p, PyObject *v, const formatdef *f)
|
np_ulong(char *p, PyObject *v, const formatdef *f)
|
||||||
{
|
{
|
||||||
unsigned long x;
|
unsigned long x;
|
||||||
if (get_ulong(v, &x) < 0)
|
if (get_wrapped_ulong(v, &x) < 0)
|
||||||
return _range_error(f, 1);
|
return -1;
|
||||||
memcpy(p, (char *)&x, sizeof x);
|
memcpy(p, (char *)&x, sizeof x);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2331,7 +2331,7 @@ static PyObject *
|
||||||
dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
|
dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
|
||||||
{
|
{
|
||||||
dictiterobject *di;
|
dictiterobject *di;
|
||||||
di = PyObject_New(dictiterobject, itertype);
|
di = PyObject_GC_New(dictiterobject, itertype);
|
||||||
if (di == NULL)
|
if (di == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
Py_INCREF(dict);
|
Py_INCREF(dict);
|
||||||
|
@ -2348,6 +2348,7 @@ dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
di->di_result = NULL;
|
di->di_result = NULL;
|
||||||
|
_PyObject_GC_TRACK(di);
|
||||||
return (PyObject *)di;
|
return (PyObject *)di;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2356,7 +2357,15 @@ dictiter_dealloc(dictiterobject *di)
|
||||||
{
|
{
|
||||||
Py_XDECREF(di->di_dict);
|
Py_XDECREF(di->di_dict);
|
||||||
Py_XDECREF(di->di_result);
|
Py_XDECREF(di->di_result);
|
||||||
PyObject_Del(di);
|
PyObject_GC_Del(di);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
dictiter_traverse(dictiterobject *di, visitproc visit, void *arg)
|
||||||
|
{
|
||||||
|
Py_VISIT(di->di_dict);
|
||||||
|
Py_VISIT(di->di_result);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -2435,9 +2444,9 @@ PyTypeObject PyDictIterKey_Type = {
|
||||||
PyObject_GenericGetAttr, /* tp_getattro */
|
PyObject_GenericGetAttr, /* tp_getattro */
|
||||||
0, /* tp_setattro */
|
0, /* tp_setattro */
|
||||||
0, /* tp_as_buffer */
|
0, /* tp_as_buffer */
|
||||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
|
||||||
0, /* tp_doc */
|
0, /* tp_doc */
|
||||||
0, /* tp_traverse */
|
(traverseproc)dictiter_traverse, /* tp_traverse */
|
||||||
0, /* tp_clear */
|
0, /* tp_clear */
|
||||||
0, /* tp_richcompare */
|
0, /* tp_richcompare */
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
|
@ -2507,9 +2516,9 @@ PyTypeObject PyDictIterValue_Type = {
|
||||||
PyObject_GenericGetAttr, /* tp_getattro */
|
PyObject_GenericGetAttr, /* tp_getattro */
|
||||||
0, /* tp_setattro */
|
0, /* tp_setattro */
|
||||||
0, /* tp_as_buffer */
|
0, /* tp_as_buffer */
|
||||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
|
||||||
0, /* tp_doc */
|
0, /* tp_doc */
|
||||||
0, /* tp_traverse */
|
(traverseproc)dictiter_traverse, /* tp_traverse */
|
||||||
0, /* tp_clear */
|
0, /* tp_clear */
|
||||||
0, /* tp_richcompare */
|
0, /* tp_richcompare */
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
|
@ -2593,9 +2602,9 @@ PyTypeObject PyDictIterItem_Type = {
|
||||||
PyObject_GenericGetAttr, /* tp_getattro */
|
PyObject_GenericGetAttr, /* tp_getattro */
|
||||||
0, /* tp_setattro */
|
0, /* tp_setattro */
|
||||||
0, /* tp_as_buffer */
|
0, /* tp_as_buffer */
|
||||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
|
||||||
0, /* tp_doc */
|
0, /* tp_doc */
|
||||||
0, /* tp_traverse */
|
(traverseproc)dictiter_traverse, /* tp_traverse */
|
||||||
0, /* tp_clear */
|
0, /* tp_clear */
|
||||||
0, /* tp_richcompare */
|
0, /* tp_richcompare */
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
|
|
|
@ -132,8 +132,8 @@ dircheck(PyFileObject* f)
|
||||||
if (fstat(fileno(f->f_fp), &buf) == 0 &&
|
if (fstat(fileno(f->f_fp), &buf) == 0 &&
|
||||||
S_ISDIR(buf.st_mode)) {
|
S_ISDIR(buf.st_mode)) {
|
||||||
char *msg = strerror(EISDIR);
|
char *msg = strerror(EISDIR);
|
||||||
PyObject *exc = PyObject_CallFunction(PyExc_IOError, "(is)",
|
PyObject *exc = PyObject_CallFunction(PyExc_IOError, "(isO)",
|
||||||
EISDIR, msg);
|
EISDIR, msg, f->f_name);
|
||||||
PyErr_SetObject(PyExc_IOError, exc);
|
PyErr_SetObject(PyExc_IOError, exc);
|
||||||
Py_XDECREF(exc);
|
Py_XDECREF(exc);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -810,7 +810,14 @@ static void
|
||||||
setiter_dealloc(setiterobject *si)
|
setiter_dealloc(setiterobject *si)
|
||||||
{
|
{
|
||||||
Py_XDECREF(si->si_set);
|
Py_XDECREF(si->si_set);
|
||||||
PyObject_Del(si);
|
PyObject_GC_Del(si);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
setiter_traverse(setiterobject *si, visitproc visit, void *arg)
|
||||||
|
{
|
||||||
|
Py_VISIT(si->si_set);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -888,9 +895,9 @@ static PyTypeObject PySetIter_Type = {
|
||||||
PyObject_GenericGetAttr, /* tp_getattro */
|
PyObject_GenericGetAttr, /* tp_getattro */
|
||||||
0, /* tp_setattro */
|
0, /* tp_setattro */
|
||||||
0, /* tp_as_buffer */
|
0, /* tp_as_buffer */
|
||||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
|
||||||
0, /* tp_doc */
|
0, /* tp_doc */
|
||||||
0, /* tp_traverse */
|
(traverseproc)setiter_traverse, /* tp_traverse */
|
||||||
0, /* tp_clear */
|
0, /* tp_clear */
|
||||||
0, /* tp_richcompare */
|
0, /* tp_richcompare */
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
|
@ -903,7 +910,7 @@ static PyTypeObject PySetIter_Type = {
|
||||||
static PyObject *
|
static PyObject *
|
||||||
set_iter(PySetObject *so)
|
set_iter(PySetObject *so)
|
||||||
{
|
{
|
||||||
setiterobject *si = PyObject_New(setiterobject, &PySetIter_Type);
|
setiterobject *si = PyObject_GC_New(setiterobject, &PySetIter_Type);
|
||||||
if (si == NULL)
|
if (si == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
Py_INCREF(so);
|
Py_INCREF(so);
|
||||||
|
@ -911,6 +918,7 @@ set_iter(PySetObject *so)
|
||||||
si->si_used = so->used;
|
si->si_used = so->used;
|
||||||
si->si_pos = 0;
|
si->si_pos = 0;
|
||||||
si->len = so->used;
|
si->len = so->used;
|
||||||
|
_PyObject_GC_TRACK(si);
|
||||||
return (PyObject *)si;
|
return (PyObject *)si;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -293,3 +293,58 @@ class SmallLists(Test):
|
||||||
|
|
||||||
for i in xrange(self.rounds):
|
for i in xrange(self.rounds):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class SimpleListComprehensions(Test):
|
||||||
|
|
||||||
|
version = 2.0
|
||||||
|
operations = 6
|
||||||
|
rounds = 20000
|
||||||
|
|
||||||
|
def test(self):
|
||||||
|
|
||||||
|
n = range(10) * 10
|
||||||
|
|
||||||
|
for i in xrange(self.rounds):
|
||||||
|
l = [x for x in n]
|
||||||
|
l = [x for x in n if x]
|
||||||
|
l = [x for x in n if not x]
|
||||||
|
|
||||||
|
l = [x for x in n]
|
||||||
|
l = [x for x in n if x]
|
||||||
|
l = [x for x in n if not x]
|
||||||
|
|
||||||
|
def calibrate(self):
|
||||||
|
|
||||||
|
n = range(10) * 10
|
||||||
|
|
||||||
|
for i in xrange(self.rounds):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NestedListComprehensions(Test):
|
||||||
|
|
||||||
|
version = 2.0
|
||||||
|
operations = 6
|
||||||
|
rounds = 20000
|
||||||
|
|
||||||
|
def test(self):
|
||||||
|
|
||||||
|
m = range(10)
|
||||||
|
n = range(10)
|
||||||
|
|
||||||
|
for i in xrange(self.rounds):
|
||||||
|
l = [x for x in n for y in m]
|
||||||
|
l = [y for x in n for y in m]
|
||||||
|
|
||||||
|
l = [x for x in n for y in m if y]
|
||||||
|
l = [y for x in n for y in m if x]
|
||||||
|
|
||||||
|
l = [x for x in n for y in m if not y]
|
||||||
|
l = [y for x in n for y in m if not x]
|
||||||
|
|
||||||
|
def calibrate(self):
|
||||||
|
|
||||||
|
m = range(10)
|
||||||
|
n = range(10)
|
||||||
|
|
||||||
|
for i in xrange(self.rounds):
|
||||||
|
pass
|
||||||
|
|
Loading…
Reference in New Issue