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:
Georg Brandl 2009-01-01 15:46:10 +00:00
parent b5fc36c86e
commit 47fe9817f1
35 changed files with 438 additions and 110 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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('''

View File

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

View File

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

View File

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

View File

@ -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+"):

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 */

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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 */

View File

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

View File

@ -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;
} }

View File

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