| **************************** | |
| What's New in Python 2.5 | |
| **************************** | |
| :Author: A.M. Kuchling | |
| .. |release| replace:: 1.01 | |
| .. $Id: whatsnew25.tex 56611 2007-07-29 08:26:10Z georg.brandl $ | |
| .. Fix XXX comments | |
| This article explains the new features in Python 2.5. The final release of | |
| Python 2.5 is scheduled for August 2006; :pep:`356` describes the planned | |
| release schedule. | |
| The changes in Python 2.5 are an interesting mix of language and library | |
| improvements. The library enhancements will be more important to Python's user | |
| community, I think, because several widely-useful packages were added. New | |
| modules include ElementTree for XML processing (:mod:`xml.etree`), | |
| the SQLite database module (:mod:`sqlite`), and the :mod:`ctypes` | |
| module for calling C functions. | |
| The language changes are of middling significance. Some pleasant new features | |
| were added, but most of them aren't features that you'll use every day. | |
| Conditional expressions were finally added to the language using a novel syntax; | |
| see section :ref:`pep-308`. The new ':keyword:`with`' statement will make | |
| writing cleanup code easier (section :ref:`pep-343`). Values can now be passed | |
| into generators (section :ref:`pep-342`). Imports are now visible as either | |
| absolute or relative (section :ref:`pep-328`). Some corner cases of exception | |
| handling are handled better (section :ref:`pep-341`). All these improvements | |
| are worthwhile, but they're improvements to one specific language feature or | |
| another; none of them are broad modifications to Python's semantics. | |
| As well as the language and library additions, other improvements and bugfixes | |
| were made throughout the source tree. A search through the SVN change logs | |
| finds there were 353 patches applied and 458 bugs fixed between Python 2.4 and | |
| 2.5. (Both figures are likely to be underestimates.) | |
| This article doesn't try to be a complete specification of the new features; | |
| instead changes are briefly introduced using helpful examples. For full | |
| details, you should always refer to the documentation for Python 2.5 at | |
| https://docs.python.org. If you want to understand the complete implementation | |
| and design rationale, refer to the PEP for a particular new feature. | |
| Comments, suggestions, and error reports for this document are welcome; please | |
| e-mail them to the author or open a bug in the Python bug tracker. | |
| .. ====================================================================== | |
| .. _pep-308: | |
| PEP 308: Conditional Expressions | |
| ================================ | |
| For a long time, people have been requesting a way to write conditional | |
| expressions, which are expressions that return value A or value B depending on | |
| whether a Boolean value is true or false. A conditional expression lets you | |
| write a single assignment statement that has the same effect as the following:: | |
| if condition: | |
| x = true_value | |
| else: | |
| x = false_value | |
| There have been endless tedious discussions of syntax on both python-dev and | |
| comp.lang.python. A vote was even held that found the majority of voters wanted | |
| conditional expressions in some form, but there was no syntax that was preferred | |
| by a clear majority. Candidates included C's ``cond ? true_v : false_v``, ``if | |
| cond then true_v else false_v``, and 16 other variations. | |
| Guido van Rossum eventually chose a surprising syntax:: | |
| x = true_value if condition else false_value | |
| Evaluation is still lazy as in existing Boolean expressions, so the order of | |
| evaluation jumps around a bit. The *condition* expression in the middle is | |
| evaluated first, and the *true_value* expression is evaluated only if the | |
| condition was true. Similarly, the *false_value* expression is only evaluated | |
| when the condition is false. | |
| This syntax may seem strange and backwards; why does the condition go in the | |
| *middle* of the expression, and not in the front as in C's ``c ? x : y``? The | |
| decision was checked by applying the new syntax to the modules in the standard | |
| library and seeing how the resulting code read. In many cases where a | |
| conditional expression is used, one value seems to be the 'common case' and one | |
| value is an 'exceptional case', used only on rarer occasions when the condition | |
| isn't met. The conditional syntax makes this pattern a bit more obvious:: | |
| contents = ((doc + '\n') if doc else '') | |
| I read the above statement as meaning "here *contents* is usually assigned a | |
| value of ``doc+'\n'``; sometimes *doc* is empty, in which special case an empty | |
| string is returned." I doubt I will use conditional expressions very often | |
| where there isn't a clear common and uncommon case. | |
| There was some discussion of whether the language should require surrounding | |
| conditional expressions with parentheses. The decision was made to *not* | |
| require parentheses in the Python language's grammar, but as a matter of style I | |
| think you should always use them. Consider these two statements:: | |
| # First version -- no parens | |
| level = 1 if logging else 0 | |
| # Second version -- with parens | |
| level = (1 if logging else 0) | |
| In the first version, I think a reader's eye might group the statement into | |
| 'level = 1', 'if logging', 'else 0', and think that the condition decides | |
| whether the assignment to *level* is performed. The second version reads | |
| better, in my opinion, because it makes it clear that the assignment is always | |
| performed and the choice is being made between two values. | |
| Another reason for including the brackets: a few odd combinations of list | |
| comprehensions and lambdas could look like incorrect conditional expressions. | |
| See :pep:`308` for some examples. If you put parentheses around your | |
| conditional expressions, you won't run into this case. | |
| .. seealso:: | |
| :pep:`308` - Conditional Expressions | |
| PEP written by Guido van Rossum and Raymond D. Hettinger; implemented by Thomas | |
| Wouters. | |
| .. ====================================================================== | |
| .. _pep-309: | |
| PEP 309: Partial Function Application | |
| ===================================== | |
| The :mod:`functools` module is intended to contain tools for functional-style | |
| programming. | |
| One useful tool in this module is the :func:`partial` function. For programs | |
| written in a functional style, you'll sometimes want to construct variants of | |
| existing functions that have some of the parameters filled in. Consider a | |
| Python function ``f(a, b, c)``; you could create a new function ``g(b, c)`` that | |
| was equivalent to ``f(1, b, c)``. This is called "partial function | |
| application". | |
| :func:`partial` takes the arguments ``(function, arg1, arg2, ... kwarg1=value1, | |
| kwarg2=value2)``. The resulting object is callable, so you can just call it to | |
| invoke *function* with the filled-in arguments. | |
| Here's a small but realistic example:: | |
| import functools | |
| def log (message, subsystem): | |
| "Write the contents of 'message' to the specified subsystem." | |
| print '%s: %s' % (subsystem, message) | |
| ... | |
| server_log = functools.partial(log, subsystem='server') | |
| server_log('Unable to open socket') | |
| Here's another example, from a program that uses PyGTK. Here a context-sensitive | |
| pop-up menu is being constructed dynamically. The callback provided | |
| for the menu option is a partially applied version of the :meth:`open_item` | |
| method, where the first argument has been provided. :: | |
| ... | |
| class Application: | |
| def open_item(self, path): | |
| ... | |
| def init (self): | |
| open_func = functools.partial(self.open_item, item_path) | |
| popup_menu.append( ("Open", open_func, 1) ) | |
| Another function in the :mod:`functools` module is the | |
| ``update_wrapper(wrapper, wrapped)`` function that helps you write | |
| well-behaved decorators. :func:`update_wrapper` copies the name, module, and | |
| docstring attribute to a wrapper function so that tracebacks inside the wrapped | |
| function are easier to understand. For example, you might write:: | |
| def my_decorator(f): | |
| def wrapper(*args, **kwds): | |
| print 'Calling decorated function' | |
| return f(*args, **kwds) | |
| functools.update_wrapper(wrapper, f) | |
| return wrapper | |
| :func:`wraps` is a decorator that can be used inside your own decorators to copy | |
| the wrapped function's information. An alternate version of the previous | |
| example would be:: | |
| def my_decorator(f): | |
| @functools.wraps(f) | |
| def wrapper(*args, **kwds): | |
| print 'Calling decorated function' | |
| return f(*args, **kwds) | |
| return wrapper | |
| .. seealso:: | |
| :pep:`309` - Partial Function Application | |
| PEP proposed and written by Peter Harris; implemented by Hye-Shik Chang and Nick | |
| Coghlan, with adaptations by Raymond Hettinger. | |
| .. ====================================================================== | |
| .. _pep-314: | |
| PEP 314: Metadata for Python Software Packages v1.1 | |
| =================================================== | |
| Some simple dependency support was added to Distutils. The :func:`setup` | |
| function now has ``requires``, ``provides``, and ``obsoletes`` keyword | |
| parameters. When you build a source distribution using the ``sdist`` command, | |
| the dependency information will be recorded in the :file:`PKG-INFO` file. | |
| Another new keyword parameter is ``download_url``, which should be set to a URL | |
| for the package's source code. This means it's now possible to look up an entry | |
| in the package index, determine the dependencies for a package, and download the | |
| required packages. :: | |
| VERSION = '1.0' | |
| setup(name='PyPackage', | |
| version=VERSION, | |
| requires=['numarray', 'zlib (>=1.1.4)'], | |
| obsoletes=['OldPackage'] | |
| download_url=('http://www.example.com/pypackage/dist/pkg-%s.tar.gz' | |
| % VERSION), | |
| ) | |
| Another new enhancement to the Python package index at | |
| https://pypi.org is storing source and binary archives for a | |
| package. The new :command:`upload` Distutils command will upload a package to | |
| the repository. | |
| Before a package can be uploaded, you must be able to build a distribution using | |
| the :command:`sdist` Distutils command. Once that works, you can run ``python | |
| setup.py upload`` to add your package to the PyPI archive. Optionally you can | |
| GPG-sign the package by supplying the :option:`!--sign` and :option:`!--identity` | |
| options. | |
| Package uploading was implemented by Martin von Löwis and Richard Jones. | |
| .. seealso:: | |
| :pep:`314` - Metadata for Python Software Packages v1.1 | |
| PEP proposed and written by A.M. Kuchling, Richard Jones, and Fred Drake; | |
| implemented by Richard Jones and Fred Drake. | |
| .. ====================================================================== | |
| .. _pep-328: | |
| PEP 328: Absolute and Relative Imports | |
| ====================================== | |
| The simpler part of :pep:`328` was implemented in Python 2.4: parentheses could now | |
| be used to enclose the names imported from a module using the ``from ... import | |
| ...`` statement, making it easier to import many different names. | |
| The more complicated part has been implemented in Python 2.5: importing a module | |
| can be specified to use absolute or package-relative imports. The plan is to | |
| move toward making absolute imports the default in future versions of Python. | |
| Let's say you have a package directory like this:: | |
| pkg/ | |
| pkg/__init__.py | |
| pkg/main.py | |
| pkg/string.py | |
| This defines a package named :mod:`pkg` containing the :mod:`pkg.main` and | |
| :mod:`pkg.string` submodules. | |
| Consider the code in the :file:`main.py` module. What happens if it executes | |
| the statement ``import string``? In Python 2.4 and earlier, it will first look | |
| in the package's directory to perform a relative import, finds | |
| :file:`pkg/string.py`, imports the contents of that file as the | |
| :mod:`pkg.string` module, and that module is bound to the name ``string`` in the | |
| :mod:`pkg.main` module's namespace. | |
| That's fine if :mod:`pkg.string` was what you wanted. But what if you wanted | |
| Python's standard :mod:`string` module? There's no clean way to ignore | |
| :mod:`pkg.string` and look for the standard module; generally you had to look at | |
| the contents of ``sys.modules``, which is slightly unclean. Holger Krekel's | |
| :mod:`py.std` package provides a tidier way to perform imports from the standard | |
| library, ``import py; py.std.string.join()``, but that package isn't available | |
| on all Python installations. | |
| Reading code which relies on relative imports is also less clear, because a | |
| reader may be confused about which module, :mod:`string` or :mod:`pkg.string`, | |
| is intended to be used. Python users soon learned not to duplicate the names of | |
| standard library modules in the names of their packages' submodules, but you | |
| can't protect against having your submodule's name being used for a new module | |
| added in a future version of Python. | |
| In Python 2.5, you can switch :keyword:`import`'s behaviour to absolute imports | |
| using a ``from __future__ import absolute_import`` directive. This absolute-import | |
| behaviour will become the default in a future version (probably Python | |
| 2.7). Once absolute imports are the default, ``import string`` will always | |
| find the standard library's version. It's suggested that users should begin | |
| using absolute imports as much as possible, so it's preferable to begin writing | |
| ``from pkg import string`` in your code. | |
| Relative imports are still possible by adding a leading period to the module | |
| name when using the ``from ... import`` form:: | |
| # Import names from pkg.string | |
| from .string import name1, name2 | |
| # Import pkg.string | |
| from . import string | |
| This imports the :mod:`string` module relative to the current package, so in | |
| :mod:`pkg.main` this will import *name1* and *name2* from :mod:`pkg.string`. | |
| Additional leading periods perform the relative import starting from the parent | |
| of the current package. For example, code in the :mod:`A.B.C` module can do:: | |
| from . import D # Imports A.B.D | |
| from .. import E # Imports A.E | |
| from ..F import G # Imports A.F.G | |
| Leading periods cannot be used with the ``import modname`` form of the import | |
| statement, only the ``from ... import`` form. | |
| .. seealso:: | |
| :pep:`328` - Imports: Multi-Line and Absolute/Relative | |
| PEP written by Aahz; implemented by Thomas Wouters. | |
| https://pylib.readthedocs.io/ | |
| The py library by Holger Krekel, which contains the :mod:`py.std` package. | |
| .. ====================================================================== | |
| .. _pep-338: | |
| PEP 338: Executing Modules as Scripts | |
| ===================================== | |
| The :option:`-m` switch added in Python 2.4 to execute a module as a script | |
| gained a few more abilities. Instead of being implemented in C code inside the | |
| Python interpreter, the switch now uses an implementation in a new module, | |
| :mod:`runpy`. | |
| The :mod:`runpy` module implements a more sophisticated import mechanism so that | |
| it's now possible to run modules in a package such as :mod:`pychecker.checker`. | |
| The module also supports alternative import mechanisms such as the | |
| :mod:`zipimport` module. This means you can add a .zip archive's path to | |
| ``sys.path`` and then use the :option:`-m` switch to execute code from the | |
| archive. | |
| .. seealso:: | |
| :pep:`338` - Executing modules as scripts | |
| PEP written and implemented by Nick Coghlan. | |
| .. ====================================================================== | |
| .. _pep-341: | |
| PEP 341: Unified try/except/finally | |
| =================================== | |
| Until Python 2.5, the :keyword:`try` statement came in two flavours. You could | |
| use a :keyword:`finally` block to ensure that code is always executed, or one or | |
| more :keyword:`except` blocks to catch specific exceptions. You couldn't | |
| combine both :keyword:`!except` blocks and a :keyword:`!finally` block, because | |
| generating the right bytecode for the combined version was complicated and it | |
| wasn't clear what the semantics of the combined statement should be. | |
| Guido van Rossum spent some time working with Java, which does support the | |
| equivalent of combining :keyword:`except` blocks and a :keyword:`finally` block, | |
| and this clarified what the statement should mean. In Python 2.5, you can now | |
| write:: | |
| try: | |
| block-1 ... | |
| except Exception1: | |
| handler-1 ... | |
| except Exception2: | |
| handler-2 ... | |
| else: | |
| else-block | |
| finally: | |
| final-block | |
| The code in *block-1* is executed. If the code raises an exception, the various | |
| :keyword:`except` blocks are tested: if the exception is of class | |
| :class:`Exception1`, *handler-1* is executed; otherwise if it's of class | |
| :class:`Exception2`, *handler-2* is executed, and so forth. If no exception is | |
| raised, the *else-block* is executed. | |
| No matter what happened previously, the *final-block* is executed once the code | |
| block is complete and any raised exceptions handled. Even if there's an error in | |
| an exception handler or the *else-block* and a new exception is raised, the code | |
| in the *final-block* is still run. | |
| .. seealso:: | |
| :pep:`341` - Unifying try-except and try-finally | |
| PEP written by Georg Brandl; implementation by Thomas Lee. | |
| .. ====================================================================== | |
| .. _pep-342: | |
| PEP 342: New Generator Features | |
| =============================== | |
| Python 2.5 adds a simple way to pass values *into* a generator. As introduced in | |
| Python 2.3, generators only produce output; once a generator's code was invoked | |
| to create an iterator, there was no way to pass any new information into the | |
| function when its execution is resumed. Sometimes the ability to pass in some | |
| information would be useful. Hackish solutions to this include making the | |
| generator's code look at a global variable and then changing the global | |
| variable's value, or passing in some mutable object that callers then modify. | |
| To refresh your memory of basic generators, here's a simple example:: | |
| def counter (maximum): | |
| i = 0 | |
| while i < maximum: | |
| yield i | |
| i += 1 | |
| When you call ``counter(10)``, the result is an iterator that returns the values | |
| from 0 up to 9. On encountering the :keyword:`yield` statement, the iterator | |
| returns the provided value and suspends the function's execution, preserving the | |
| local variables. Execution resumes on the following call to the iterator's | |
| :meth:`next` method, picking up after the :keyword:`!yield` statement. | |
| In Python 2.3, :keyword:`yield` was a statement; it didn't return any value. In | |
| 2.5, :keyword:`!yield` is now an expression, returning a value that can be | |
| assigned to a variable or otherwise operated on:: | |
| val = (yield i) | |
| I recommend that you always put parentheses around a :keyword:`yield` expression | |
| when you're doing something with the returned value, as in the above example. | |
| The parentheses aren't always necessary, but it's easier to always add them | |
| instead of having to remember when they're needed. | |
| (:pep:`342` explains the exact rules, which are that a | |
| :keyword:`yield`\ -expression must always be parenthesized except when it | |
| occurs at the top-level | |
| expression on the right-hand side of an assignment. This means you can write | |
| ``val = yield i`` but have to use parentheses when there's an operation, as in | |
| ``val = (yield i) + 12``.) | |
| Values are sent into a generator by calling its ``send(value)`` method. The | |
| generator's code is then resumed and the :keyword:`yield` expression returns the | |
| specified *value*. If the regular :meth:`next` method is called, the | |
| :keyword:`!yield` returns :const:`None`. | |
| Here's the previous example, modified to allow changing the value of the | |
| internal counter. :: | |
| def counter (maximum): | |
| i = 0 | |
| while i < maximum: | |
| val = (yield i) | |
| # If value provided, change counter | |
| if val is not None: | |
| i = val | |
| else: | |
| i += 1 | |
| And here's an example of changing the counter:: | |
| >>> it = counter(10) | |
| >>> print it.next() | |
| 0 | |
| >>> print it.next() | |
| 1 | |
| >>> print it.send(8) | |
| 8 | |
| >>> print it.next() | |
| 9 | |
| >>> print it.next() | |
| Traceback (most recent call last): | |
| File "t.py", line 15, in ? | |
| print it.next() | |
| StopIteration | |
| :keyword:`yield` will usually return :const:`None`, so you should always check | |
| for this case. Don't just use its value in expressions unless you're sure that | |
| the :meth:`send` method will be the only method used to resume your generator | |
| function. | |
| In addition to :meth:`send`, there are two other new methods on generators: | |
| * ``throw(type, value=None, traceback=None)`` is used to raise an exception | |
| inside the generator; the exception is raised by the :keyword:`yield` expression | |
| where the generator's execution is paused. | |
| * :meth:`close` raises a new :exc:`GeneratorExit` exception inside the generator | |
| to terminate the iteration. On receiving this exception, the generator's code | |
| must either raise :exc:`GeneratorExit` or :exc:`StopIteration`. Catching the | |
| :exc:`GeneratorExit` exception and returning a value is illegal and will trigger | |
| a :exc:`RuntimeError`; if the function raises some other exception, that | |
| exception is propagated to the caller. :meth:`close` will also be called by | |
| Python's garbage collector when the generator is garbage-collected. | |
| If you need to run cleanup code when a :exc:`GeneratorExit` occurs, I suggest | |
| using a ``try: ... finally:`` suite instead of catching :exc:`GeneratorExit`. | |
| The cumulative effect of these changes is to turn generators from one-way | |
| producers of information into both producers and consumers. | |
| Generators also become *coroutines*, a more generalized form of subroutines. | |
| Subroutines are entered at one point and exited at another point (the top of the | |
| function, and a :keyword:`return` statement), but coroutines can be entered, | |
| exited, and resumed at many different points (the :keyword:`yield` statements). | |
| We'll have to figure out patterns for using coroutines effectively in Python. | |
| The addition of the :meth:`close` method has one side effect that isn't obvious. | |
| :meth:`close` is called when a generator is garbage-collected, so this means the | |
| generator's code gets one last chance to run before the generator is destroyed. | |
| This last chance means that ``try...finally`` statements in generators can now | |
| be guaranteed to work; the :keyword:`finally` clause will now always get a | |
| chance to run. The syntactic restriction that you couldn't mix :keyword:`yield` | |
| statements with a ``try...finally`` suite has therefore been removed. This | |
| seems like a minor bit of language trivia, but using generators and | |
| ``try...finally`` is actually necessary in order to implement the | |
| :keyword:`with` statement described by :pep:`343`. I'll look at this new statement | |
| in the following section. | |
| Another even more esoteric effect of this change: previously, the | |
| :attr:`gi_frame` attribute of a generator was always a frame object. It's now | |
| possible for :attr:`gi_frame` to be ``None`` once the generator has been | |
| exhausted. | |
| .. seealso:: | |
| :pep:`342` - Coroutines via Enhanced Generators | |
| PEP written by Guido van Rossum and Phillip J. Eby; implemented by Phillip J. | |
| Eby. Includes examples of some fancier uses of generators as coroutines. | |
| Earlier versions of these features were proposed in :pep:`288` by Raymond | |
| Hettinger and :pep:`325` by Samuele Pedroni. | |
| https://en.wikipedia.org/wiki/Coroutine | |
| The Wikipedia entry for coroutines. | |
| http://www.sidhe.org/~dan/blog/archives/000178.html | |
| An explanation of coroutines from a Perl point of view, written by Dan Sugalski. | |
| .. ====================================================================== | |
| .. _pep-343: | |
| PEP 343: The 'with' statement | |
| ============================= | |
| The ':keyword:`with`' statement clarifies code that previously would use | |
| ``try...finally`` blocks to ensure that clean-up code is executed. In this | |
| section, I'll discuss the statement as it will commonly be used. In the next | |
| section, I'll examine the implementation details and show how to write objects | |
| for use with this statement. | |
| The ':keyword:`with`' statement is a new control-flow structure whose basic | |
| structure is:: | |
| with expression [as variable]: | |
| with-block | |
| The expression is evaluated, and it should result in an object that supports the | |
| context management protocol (that is, has :meth:`__enter__` and :meth:`__exit__` | |
| methods. | |
| The object's :meth:`__enter__` is called before *with-block* is executed and | |
| therefore can run set-up code. It also may return a value that is bound to the | |
| name *variable*, if given. (Note carefully that *variable* is *not* assigned | |
| the result of *expression*.) | |
| After execution of the *with-block* is finished, the object's :meth:`__exit__` | |
| method is called, even if the block raised an exception, and can therefore run | |
| clean-up code. | |
| To enable the statement in Python 2.5, you need to add the following directive | |
| to your module:: | |
| from __future__ import with_statement | |
| The statement will always be enabled in Python 2.6. | |
| Some standard Python objects now support the context management protocol and can | |
| be used with the ':keyword:`with`' statement. File objects are one example:: | |
| with open('/etc/passwd', 'r') as f: | |
| for line in f: | |
| print line | |
| ... more processing code ... | |
| After this statement has executed, the file object in *f* will have been | |
| automatically closed, even if the :keyword:`for` loop raised an exception | |
| part-way through the block. | |
| .. note:: | |
| In this case, *f* is the same object created by :func:`open`, because | |
| :meth:`file.__enter__` returns *self*. | |
| The :mod:`threading` module's locks and condition variables also support the | |
| ':keyword:`with`' statement:: | |
| lock = threading.Lock() | |
| with lock: | |
| # Critical section of code | |
| ... | |
| The lock is acquired before the block is executed and always released once the | |
| block is complete. | |
| The new :func:`localcontext` function in the :mod:`decimal` module makes it easy | |
| to save and restore the current decimal context, which encapsulates the desired | |
| precision and rounding characteristics for computations:: | |
| from decimal import Decimal, Context, localcontext | |
| # Displays with default precision of 28 digits | |
| v = Decimal('578') | |
| print v.sqrt() | |
| with localcontext(Context(prec=16)): | |
| # All code in this block uses a precision of 16 digits. | |
| # The original context is restored on exiting the block. | |
| print v.sqrt() | |
| .. _new-25-context-managers: | |
| Writing Context Managers | |
| ------------------------ | |
| Under the hood, the ':keyword:`with`' statement is fairly complicated. Most | |
| people will only use ':keyword:`!with`' in company with existing objects and | |
| don't need to know these details, so you can skip the rest of this section if | |
| you like. Authors of new objects will need to understand the details of the | |
| underlying implementation and should keep reading. | |
| A high-level explanation of the context management protocol is: | |
| * The expression is evaluated and should result in an object called a "context | |
| manager". The context manager must have :meth:`__enter__` and :meth:`__exit__` | |
| methods. | |
| * The context manager's :meth:`__enter__` method is called. The value returned | |
| is assigned to *VAR*. If no ``'as VAR'`` clause is present, the value is simply | |
| discarded. | |
| * The code in *BLOCK* is executed. | |
| * If *BLOCK* raises an exception, the ``__exit__(type, value, traceback)`` | |
| is called with the exception details, the same values returned by | |
| :func:`sys.exc_info`. The method's return value controls whether the exception | |
| is re-raised: any false value re-raises the exception, and ``True`` will result | |
| in suppressing it. You'll only rarely want to suppress the exception, because | |
| if you do the author of the code containing the ':keyword:`with`' statement will | |
| never realize anything went wrong. | |
| * If *BLOCK* didn't raise an exception, the :meth:`__exit__` method is still | |
| called, but *type*, *value*, and *traceback* are all ``None``. | |
| Let's think through an example. I won't present detailed code but will only | |
| sketch the methods necessary for a database that supports transactions. | |
| (For people unfamiliar with database terminology: a set of changes to the | |
| database are grouped into a transaction. Transactions can be either committed, | |
| meaning that all the changes are written into the database, or rolled back, | |
| meaning that the changes are all discarded and the database is unchanged. See | |
| any database textbook for more information.) | |
| Let's assume there's an object representing a database connection. Our goal will | |
| be to let the user write code like this:: | |
| db_connection = DatabaseConnection() | |
| with db_connection as cursor: | |
| cursor.execute('insert into ...') | |
| cursor.execute('delete from ...') | |
| # ... more operations ... | |
| The transaction should be committed if the code in the block runs flawlessly or | |
| rolled back if there's an exception. Here's the basic interface for | |
| :class:`DatabaseConnection` that I'll assume:: | |
| class DatabaseConnection: | |
| # Database interface | |
| def cursor (self): | |
| "Returns a cursor object and starts a new transaction" | |
| def commit (self): | |
| "Commits current transaction" | |
| def rollback (self): | |
| "Rolls back current transaction" | |
| The :meth:`__enter__` method is pretty easy, having only to start a new | |
| transaction. For this application the resulting cursor object would be a useful | |
| result, so the method will return it. The user can then add ``as cursor`` to | |
| their ':keyword:`with`' statement to bind the cursor to a variable name. :: | |
| class DatabaseConnection: | |
| ... | |
| def __enter__ (self): | |
| # Code to start a new transaction | |
| cursor = self.cursor() | |
| return cursor | |
| The :meth:`__exit__` method is the most complicated because it's where most of | |
| the work has to be done. The method has to check if an exception occurred. If | |
| there was no exception, the transaction is committed. The transaction is rolled | |
| back if there was an exception. | |
| In the code below, execution will just fall off the end of the function, | |
| returning the default value of ``None``. ``None`` is false, so the exception | |
| will be re-raised automatically. If you wished, you could be more explicit and | |
| add a :keyword:`return` statement at the marked location. :: | |
| class DatabaseConnection: | |
| ... | |
| def __exit__ (self, type, value, tb): | |
| if tb is None: | |
| # No exception, so commit | |
| self.commit() | |
| else: | |
| # Exception occurred, so rollback. | |
| self.rollback() | |
| # return False | |
| .. _contextlibmod: | |
| The contextlib module | |
| --------------------- | |
| The new :mod:`contextlib` module provides some functions and a decorator that | |
| are useful for writing objects for use with the ':keyword:`with`' statement. | |
| The decorator is called :func:`contextmanager`, and lets you write a single | |
| generator function instead of defining a new class. The generator should yield | |
| exactly one value. The code up to the :keyword:`yield` will be executed as the | |
| :meth:`__enter__` method, and the value yielded will be the method's return | |
| value that will get bound to the variable in the ':keyword:`with`' statement's | |
| :keyword:`!as` clause, if any. The code after the :keyword:`yield` will be | |
| executed in the :meth:`__exit__` method. Any exception raised in the block will | |
| be raised by the :keyword:`!yield` statement. | |
| Our database example from the previous section could be written using this | |
| decorator as:: | |
| from contextlib import contextmanager | |
| @contextmanager | |
| def db_transaction (connection): | |
| cursor = connection.cursor() | |
| try: | |
| yield cursor | |
| except: | |
| connection.rollback() | |
| raise | |
| else: | |
| connection.commit() | |
| db = DatabaseConnection() | |
| with db_transaction(db) as cursor: | |
| ... | |
| The :mod:`contextlib` module also has a ``nested(mgr1, mgr2, ...)`` function | |
| that combines a number of context managers so you don't need to write nested | |
| ':keyword:`with`' statements. In this example, the single ':keyword:`!with`' | |
| statement both starts a database transaction and acquires a thread lock:: | |
| lock = threading.Lock() | |
| with nested (db_transaction(db), lock) as (cursor, locked): | |
| ... | |
| Finally, the ``closing(object)`` function returns *object* so that it can be | |
| bound to a variable, and calls ``object.close`` at the end of the block. :: | |
| import urllib, sys | |
| from contextlib import closing | |
| with closing(urllib.urlopen('http://www.yahoo.com')) as f: | |
| for line in f: | |
| sys.stdout.write(line) | |
| .. seealso:: | |
| :pep:`343` - The "with" statement | |
| PEP written by Guido van Rossum and Nick Coghlan; implemented by Mike Bland, | |
| Guido van Rossum, and Neal Norwitz. The PEP shows the code generated for a | |
| ':keyword:`with`' statement, which can be helpful in learning how the statement | |
| works. | |
| The documentation for the :mod:`contextlib` module. | |
| .. ====================================================================== | |
| .. _pep-352: | |
| PEP 352: Exceptions as New-Style Classes | |
| ======================================== | |
| Exception classes can now be new-style classes, not just classic classes, and | |
| the built-in :exc:`Exception` class and all the standard built-in exceptions | |
| (:exc:`NameError`, :exc:`ValueError`, etc.) are now new-style classes. | |
| The inheritance hierarchy for exceptions has been rearranged a bit. In 2.5, the | |
| inheritance relationships are:: | |
| BaseException # New in Python 2.5 | |
| |- KeyboardInterrupt | |
| |- SystemExit | |
| |- Exception | |
| |- (all other current built-in exceptions) | |
| This rearrangement was done because people often want to catch all exceptions | |
| that indicate program errors. :exc:`KeyboardInterrupt` and :exc:`SystemExit` | |
| aren't errors, though, and usually represent an explicit action such as the user | |
| hitting :kbd:`Control-C` or code calling :func:`sys.exit`. A bare ``except:`` will | |
| catch all exceptions, so you commonly need to list :exc:`KeyboardInterrupt` and | |
| :exc:`SystemExit` in order to re-raise them. The usual pattern is:: | |
| try: | |
| ... | |
| except (KeyboardInterrupt, SystemExit): | |
| raise | |
| except: | |
| # Log error... | |
| # Continue running program... | |
| In Python 2.5, you can now write ``except Exception`` to achieve the same | |
| result, catching all the exceptions that usually indicate errors but leaving | |
| :exc:`KeyboardInterrupt` and :exc:`SystemExit` alone. As in previous versions, | |
| a bare ``except:`` still catches all exceptions. | |
| The goal for Python 3.0 is to require any class raised as an exception to derive | |
| from :exc:`BaseException` or some descendant of :exc:`BaseException`, and future | |
| releases in the Python 2.x series may begin to enforce this constraint. | |
| Therefore, I suggest you begin making all your exception classes derive from | |
| :exc:`Exception` now. It's been suggested that the bare ``except:`` form should | |
| be removed in Python 3.0, but Guido van Rossum hasn't decided whether to do this | |
| or not. | |
| Raising of strings as exceptions, as in the statement ``raise "Error | |
| occurred"``, is deprecated in Python 2.5 and will trigger a warning. The aim is | |
| to be able to remove the string-exception feature in a few releases. | |
| .. seealso:: | |
| :pep:`352` - Required Superclass for Exceptions | |
| PEP written by Brett Cannon and Guido van Rossum; implemented by Brett Cannon. | |
| .. ====================================================================== | |
| .. _pep-353: | |
| PEP 353: Using ssize_t as the index type | |
| ======================================== | |
| A wide-ranging change to Python's C API, using a new :c:type:`Py_ssize_t` type | |
| definition instead of :c:type:`int`, will permit the interpreter to handle more | |
| data on 64-bit platforms. This change doesn't affect Python's capacity on 32-bit | |
| platforms. | |
| Various pieces of the Python interpreter used C's :c:type:`int` type to store | |
| sizes or counts; for example, the number of items in a list or tuple were stored | |
| in an :c:type:`int`. The C compilers for most 64-bit platforms still define | |
| :c:type:`int` as a 32-bit type, so that meant that lists could only hold up to | |
| ``2**31 - 1`` = 2147483647 items. (There are actually a few different | |
| programming models that 64-bit C compilers can use -- see | |
| http://www.unix.org/version2/whatsnew/lp64_wp.html for a discussion -- but the | |
| most commonly available model leaves :c:type:`int` as 32 bits.) | |
| A limit of 2147483647 items doesn't really matter on a 32-bit platform because | |
| you'll run out of memory before hitting the length limit. Each list item | |
| requires space for a pointer, which is 4 bytes, plus space for a | |
| :c:type:`PyObject` representing the item. 2147483647\*4 is already more bytes | |
| than a 32-bit address space can contain. | |
| It's possible to address that much memory on a 64-bit platform, however. The | |
| pointers for a list that size would only require 16 GiB of space, so it's not | |
| unreasonable that Python programmers might construct lists that large. | |
| Therefore, the Python interpreter had to be changed to use some type other than | |
| :c:type:`int`, and this will be a 64-bit type on 64-bit platforms. The change | |
| will cause incompatibilities on 64-bit machines, so it was deemed worth making | |
| the transition now, while the number of 64-bit users is still relatively small. | |
| (In 5 or 10 years, we may *all* be on 64-bit machines, and the transition would | |
| be more painful then.) | |
| This change most strongly affects authors of C extension modules. Python | |
| strings and container types such as lists and tuples now use | |
| :c:type:`Py_ssize_t` to store their size. Functions such as | |
| :c:func:`PyList_Size` now return :c:type:`Py_ssize_t`. Code in extension modules | |
| may therefore need to have some variables changed to :c:type:`Py_ssize_t`. | |
| The :c:func:`PyArg_ParseTuple` and :c:func:`Py_BuildValue` functions have a new | |
| conversion code, ``n``, for :c:type:`Py_ssize_t`. :c:func:`PyArg_ParseTuple`'s | |
| ``s#`` and ``t#`` still output :c:type:`int` by default, but you can define the | |
| macro :c:macro:`PY_SSIZE_T_CLEAN` before including :file:`Python.h` to make | |
| them return :c:type:`Py_ssize_t`. | |
| :pep:`353` has a section on conversion guidelines that extension authors should | |
| read to learn about supporting 64-bit platforms. | |
| .. seealso:: | |
| :pep:`353` - Using ssize_t as the index type | |
| PEP written and implemented by Martin von Löwis. | |
| .. ====================================================================== | |
| .. _pep-357: | |
| PEP 357: The '__index__' method | |
| =============================== | |
| The NumPy developers had a problem that could only be solved by adding a new | |
| special method, :meth:`__index__`. When using slice notation, as in | |
| ``[start:stop:step]``, the values of the *start*, *stop*, and *step* indexes | |
| must all be either integers or long integers. NumPy defines a variety of | |
| specialized integer types corresponding to unsigned and signed integers of 8, | |
| 16, 32, and 64 bits, but there was no way to signal that these types could be | |
| used as slice indexes. | |
| Slicing can't just use the existing :meth:`__int__` method because that method | |
| is also used to implement coercion to integers. If slicing used | |
| :meth:`__int__`, floating-point numbers would also become legal slice indexes | |
| and that's clearly an undesirable behaviour. | |
| Instead, a new special method called :meth:`__index__` was added. It takes no | |
| arguments and returns an integer giving the slice index to use. For example:: | |
| class C: | |
| def __index__ (self): | |
| return self.value | |
| The return value must be either a Python integer or long integer. The | |
| interpreter will check that the type returned is correct, and raises a | |
| :exc:`TypeError` if this requirement isn't met. | |
| A corresponding :attr:`nb_index` slot was added to the C-level | |
| :c:type:`PyNumberMethods` structure to let C extensions implement this protocol. | |
| ``PyNumber_Index(obj)`` can be used in extension code to call the | |
| :meth:`__index__` function and retrieve its result. | |
| .. seealso:: | |
| :pep:`357` - Allowing Any Object to be Used for Slicing | |
| PEP written and implemented by Travis Oliphant. | |
| .. ====================================================================== | |
| .. _other-lang: | |
| Other Language Changes | |
| ====================== | |
| Here are all of the changes that Python 2.5 makes to the core Python language. | |
| * The :class:`dict` type has a new hook for letting subclasses provide a default | |
| value when a key isn't contained in the dictionary. When a key isn't found, the | |
| dictionary's ``__missing__(key)`` method will be called. This hook is used | |
| to implement the new :class:`defaultdict` class in the :mod:`collections` | |
| module. The following example defines a dictionary that returns zero for any | |
| missing key:: | |
| class zerodict (dict): | |
| def __missing__ (self, key): | |
| return 0 | |
| d = zerodict({1:1, 2:2}) | |
| print d[1], d[2] # Prints 1, 2 | |
| print d[3], d[4] # Prints 0, 0 | |
| * Both 8-bit and Unicode strings have new ``partition(sep)`` and | |
| ``rpartition(sep)`` methods that simplify a common use case. | |
| The ``find(S)`` method is often used to get an index which is then used to | |
| slice the string and obtain the pieces that are before and after the separator. | |
| ``partition(sep)`` condenses this pattern into a single method call that | |
| returns a 3-tuple containing the substring before the separator, the separator | |
| itself, and the substring after the separator. If the separator isn't found, | |
| the first element of the tuple is the entire string and the other two elements | |
| are empty. ``rpartition(sep)`` also returns a 3-tuple but starts searching | |
| from the end of the string; the ``r`` stands for 'reverse'. | |
| Some examples:: | |
| >>> ('http://www.python.org').partition('://') | |
| ('http', '://', 'www.python.org') | |
| >>> ('file:/usr/share/doc/index.html').partition('://') | |
| ('file:/usr/share/doc/index.html', '', '') | |
| >>> (u'Subject: a quick question').partition(':') | |
| (u'Subject', u':', u' a quick question') | |
| >>> 'www.python.org'.rpartition('.') | |
| ('www.python', '.', 'org') | |
| >>> 'www.python.org'.rpartition(':') | |
| ('', '', 'www.python.org') | |
| (Implemented by Fredrik Lundh following a suggestion by Raymond Hettinger.) | |
| * The :meth:`startswith` and :meth:`endswith` methods of string types now accept | |
| tuples of strings to check for. :: | |
| def is_image_file (filename): | |
| return filename.endswith(('.gif', '.jpg', '.tiff')) | |
| (Implemented by Georg Brandl following a suggestion by Tom Lynn.) | |
| .. RFE #1491485 | |
| * The :func:`min` and :func:`max` built-in functions gained a ``key`` keyword | |
| parameter analogous to the ``key`` argument for :meth:`sort`. This parameter | |
| supplies a function that takes a single argument and is called for every value | |
| in the list; :func:`min`/:func:`max` will return the element with the | |
| smallest/largest return value from this function. For example, to find the | |
| longest string in a list, you can do:: | |
| L = ['medium', 'longest', 'short'] | |
| # Prints 'longest' | |
| print max(L, key=len) | |
| # Prints 'short', because lexicographically 'short' has the largest value | |
| print max(L) | |
| (Contributed by Steven Bethard and Raymond Hettinger.) | |
| * Two new built-in functions, :func:`any` and :func:`all`, evaluate whether an | |
| iterator contains any true or false values. :func:`any` returns :const:`True` | |
| if any value returned by the iterator is true; otherwise it will return | |
| :const:`False`. :func:`all` returns :const:`True` only if all of the values | |
| returned by the iterator evaluate as true. (Suggested by Guido van Rossum, and | |
| implemented by Raymond Hettinger.) | |
| * The result of a class's :meth:`__hash__` method can now be either a long | |
| integer or a regular integer. If a long integer is returned, the hash of that | |
| value is taken. In earlier versions the hash value was required to be a | |
| regular integer, but in 2.5 the :func:`id` built-in was changed to always | |
| return non-negative numbers, and users often seem to use ``id(self)`` in | |
| :meth:`__hash__` methods (though this is discouraged). | |
| .. Bug #1536021 | |
| * ASCII is now the default encoding for modules. It's now a syntax error if a | |
| module contains string literals with 8-bit characters but doesn't have an | |
| encoding declaration. In Python 2.4 this triggered a warning, not a syntax | |
| error. See :pep:`263` for how to declare a module's encoding; for example, you | |
| might add a line like this near the top of the source file:: | |
| # -*- coding: latin1 -*- | |
| * A new warning, :class:`UnicodeWarning`, is triggered when you attempt to | |
| compare a Unicode string and an 8-bit string that can't be converted to Unicode | |
| using the default ASCII encoding. The result of the comparison is false:: | |
| >>> chr(128) == unichr(128) # Can't convert chr(128) to Unicode | |
| __main__:1: UnicodeWarning: Unicode equal comparison failed | |
| to convert both arguments to Unicode - interpreting them | |
| as being unequal | |
| False | |
| >>> chr(127) == unichr(127) # chr(127) can be converted | |
| True | |
| Previously this would raise a :class:`UnicodeDecodeError` exception, but in 2.5 | |
| this could result in puzzling problems when accessing a dictionary. If you | |
| looked up ``unichr(128)`` and ``chr(128)`` was being used as a key, you'd get a | |
| :class:`UnicodeDecodeError` exception. Other changes in 2.5 resulted in this | |
| exception being raised instead of suppressed by the code in :file:`dictobject.c` | |
| that implements dictionaries. | |
| Raising an exception for such a comparison is strictly correct, but the change | |
| might have broken code, so instead :class:`UnicodeWarning` was introduced. | |
| (Implemented by Marc-André Lemburg.) | |
| * One error that Python programmers sometimes make is forgetting to include an | |
| :file:`__init__.py` module in a package directory. Debugging this mistake can be | |
| confusing, and usually requires running Python with the :option:`-v` switch to | |
| log all the paths searched. In Python 2.5, a new :exc:`ImportWarning` warning is | |
| triggered when an import would have picked up a directory as a package but no | |
| :file:`__init__.py` was found. This warning is silently ignored by default; | |
| provide the :option:`-Wd <-W>` option when running the Python executable to display | |
| the warning message. (Implemented by Thomas Wouters.) | |
| * The list of base classes in a class definition can now be empty. As an | |
| example, this is now legal:: | |
| class C(): | |
| pass | |
| (Implemented by Brett Cannon.) | |
| .. ====================================================================== | |
| .. _25interactive: | |
| Interactive Interpreter Changes | |
| ------------------------------- | |
| In the interactive interpreter, ``quit`` and ``exit`` have long been strings so | |
| that new users get a somewhat helpful message when they try to quit:: | |
| >>> quit | |
| 'Use Ctrl-D (i.e. EOF) to exit.' | |
| In Python 2.5, ``quit`` and ``exit`` are now objects that still produce string | |
| representations of themselves, but are also callable. Newbies who try ``quit()`` | |
| or ``exit()`` will now exit the interpreter as they expect. (Implemented by | |
| Georg Brandl.) | |
| The Python executable now accepts the standard long options :option:`--help` | |
| and :option:`--version`; on Windows, it also accepts the :option:`/? <-?>` option | |
| for displaying a help message. (Implemented by Georg Brandl.) | |
| .. ====================================================================== | |
| .. _opts: | |
| Optimizations | |
| ------------- | |
| Several of the optimizations were developed at the NeedForSpeed sprint, an event | |
| held in Reykjavik, Iceland, from May 21--28 2006. The sprint focused on speed | |
| enhancements to the CPython implementation and was funded by EWT LLC with local | |
| support from CCP Games. Those optimizations added at this sprint are specially | |
| marked in the following list. | |
| * When they were introduced in Python 2.4, the built-in :class:`set` and | |
| :class:`frozenset` types were built on top of Python's dictionary type. In 2.5 | |
| the internal data structure has been customized for implementing sets, and as a | |
| result sets will use a third less memory and are somewhat faster. (Implemented | |
| by Raymond Hettinger.) | |
| * The speed of some Unicode operations, such as finding substrings, string | |
| splitting, and character map encoding and decoding, has been improved. | |
| (Substring search and splitting improvements were added by Fredrik Lundh and | |
| Andrew Dalke at the NeedForSpeed sprint. Character maps were improved by Walter | |
| Dörwald and Martin von Löwis.) | |
| .. Patch 1313939, 1359618 | |
| * The ``long(str, base)`` function is now faster on long digit strings | |
| because fewer intermediate results are calculated. The peak is for strings of | |
| around 800--1000 digits where the function is 6 times faster. (Contributed by | |
| Alan McIntyre and committed at the NeedForSpeed sprint.) | |
| .. Patch 1442927 | |
| * It's now illegal to mix iterating over a file with ``for line in file`` and | |
| calling the file object's :meth:`read`/:meth:`readline`/:meth:`readlines` | |
| methods. Iteration uses an internal buffer and the :meth:`read\*` methods | |
| don't use that buffer. Instead they would return the data following the | |
| buffer, causing the data to appear out of order. Mixing iteration and these | |
| methods will now trigger a :exc:`ValueError` from the :meth:`read\*` method. | |
| (Implemented by Thomas Wouters.) | |
| .. Patch 1397960 | |
| * The :mod:`struct` module now compiles structure format strings into an | |
| internal representation and caches this representation, yielding a 20% speedup. | |
| (Contributed by Bob Ippolito at the NeedForSpeed sprint.) | |
| * The :mod:`re` module got a 1 or 2% speedup by switching to Python's allocator | |
| functions instead of the system's :c:func:`malloc` and :c:func:`free`. | |
| (Contributed by Jack Diederich at the NeedForSpeed sprint.) | |
| * The code generator's peephole optimizer now performs simple constant folding | |
| in expressions. If you write something like ``a = 2+3``, the code generator | |
| will do the arithmetic and produce code corresponding to ``a = 5``. (Proposed | |
| and implemented by Raymond Hettinger.) | |
| * Function calls are now faster because code objects now keep the most recently | |
| finished frame (a "zombie frame") in an internal field of the code object, | |
| reusing it the next time the code object is invoked. (Original patch by Michael | |
| Hudson, modified by Armin Rigo and Richard Jones; committed at the NeedForSpeed | |
| sprint.) Frame objects are also slightly smaller, which may improve cache | |
| locality and reduce memory usage a bit. (Contributed by Neal Norwitz.) | |
| .. Patch 876206 | |
| .. Patch 1337051 | |
| * Python's built-in exceptions are now new-style classes, a change that speeds | |
| up instantiation considerably. Exception handling in Python 2.5 is therefore | |
| about 30% faster than in 2.4. (Contributed by Richard Jones, Georg Brandl and | |
| Sean Reifschneider at the NeedForSpeed sprint.) | |
| * Importing now caches the paths tried, recording whether they exist or not so | |
| that the interpreter makes fewer :c:func:`open` and :c:func:`stat` calls on | |
| startup. (Contributed by Martin von Löwis and Georg Brandl.) | |
| .. Patch 921466 | |
| .. ====================================================================== | |
| .. _25modules: | |
| New, Improved, and Removed Modules | |
| ================================== | |
| The standard library received many enhancements and bug fixes in Python 2.5. | |
| Here's a partial list of the most notable changes, sorted alphabetically by | |
| module name. Consult the :file:`Misc/NEWS` file in the source tree for a more | |
| complete list of changes, or look through the SVN logs for all the details. | |
| * The :mod:`audioop` module now supports the a-LAW encoding, and the code for | |
| u-LAW encoding has been improved. (Contributed by Lars Immisch.) | |
| * The :mod:`codecs` module gained support for incremental codecs. The | |
| :func:`codec.lookup` function now returns a :class:`CodecInfo` instance instead | |
| of a tuple. :class:`CodecInfo` instances behave like a 4-tuple to preserve | |
| backward compatibility but also have the attributes :attr:`encode`, | |
| :attr:`decode`, :attr:`incrementalencoder`, :attr:`incrementaldecoder`, | |
| :attr:`streamwriter`, and :attr:`streamreader`. Incremental codecs can receive | |
| input and produce output in multiple chunks; the output is the same as if the | |
| entire input was fed to the non-incremental codec. See the :mod:`codecs` module | |
| documentation for details. (Designed and implemented by Walter Dörwald.) | |
| .. Patch 1436130 | |
| * The :mod:`collections` module gained a new type, :class:`defaultdict`, that | |
| subclasses the standard :class:`dict` type. The new type mostly behaves like a | |
| dictionary but constructs a default value when a key isn't present, | |
| automatically adding it to the dictionary for the requested key value. | |
| The first argument to :class:`defaultdict`'s constructor is a factory function | |
| that gets called whenever a key is requested but not found. This factory | |
| function receives no arguments, so you can use built-in type constructors such | |
| as :func:`list` or :func:`int`. For example, you can make an index of words | |
| based on their initial letter like this:: | |
| words = """Nel mezzo del cammin di nostra vita | |
| mi ritrovai per una selva oscura | |
| che la diritta via era smarrita""".lower().split() | |
| index = defaultdict(list) | |
| for w in words: | |
| init_letter = w[0] | |
| index[init_letter].append(w) | |
| Printing ``index`` results in the following output:: | |
| defaultdict(<type 'list'>, {'c': ['cammin', 'che'], 'e': ['era'], | |
| 'd': ['del', 'di', 'diritta'], 'm': ['mezzo', 'mi'], | |
| 'l': ['la'], 'o': ['oscura'], 'n': ['nel', 'nostra'], | |
| 'p': ['per'], 's': ['selva', 'smarrita'], | |
| 'r': ['ritrovai'], 'u': ['una'], 'v': ['vita', 'via']} | |
| (Contributed by Guido van Rossum.) | |
| * The :class:`deque` double-ended queue type supplied by the :mod:`collections` | |
| module now has a ``remove(value)`` method that removes the first occurrence | |
| of *value* in the queue, raising :exc:`ValueError` if the value isn't found. | |
| (Contributed by Raymond Hettinger.) | |
| * New module: The :mod:`contextlib` module contains helper functions for use | |
| with the new ':keyword:`with`' statement. See section :ref:`contextlibmod` | |
| for more about this module. | |
| * New module: The :mod:`cProfile` module is a C implementation of the existing | |
| :mod:`profile` module that has much lower overhead. The module's interface is | |
| the same as :mod:`profile`: you run ``cProfile.run('main()')`` to profile a | |
| function, can save profile data to a file, etc. It's not yet known if the | |
| Hotshot profiler, which is also written in C but doesn't match the | |
| :mod:`profile` module's interface, will continue to be maintained in future | |
| versions of Python. (Contributed by Armin Rigo.) | |
| Also, the :mod:`pstats` module for analyzing the data measured by the profiler | |
| now supports directing the output to any file object by supplying a *stream* | |
| argument to the :class:`Stats` constructor. (Contributed by Skip Montanaro.) | |
| * The :mod:`csv` module, which parses files in comma-separated value format, | |
| received several enhancements and a number of bugfixes. You can now set the | |
| maximum size in bytes of a field by calling the | |
| ``csv.field_size_limit(new_limit)`` function; omitting the *new_limit* | |
| argument will return the currently-set limit. The :class:`reader` class now has | |
| a :attr:`line_num` attribute that counts the number of physical lines read from | |
| the source; records can span multiple physical lines, so :attr:`line_num` is not | |
| the same as the number of records read. | |
| The CSV parser is now stricter about multi-line quoted fields. Previously, if a | |
| line ended within a quoted field without a terminating newline character, a | |
| newline would be inserted into the returned field. This behavior caused problems | |
| when reading files that contained carriage return characters within fields, so | |
| the code was changed to return the field without inserting newlines. As a | |
| consequence, if newlines embedded within fields are important, the input should | |
| be split into lines in a manner that preserves the newline characters. | |
| (Contributed by Skip Montanaro and Andrew McNamara.) | |
| * The :class:`~datetime.datetime` class in the :mod:`datetime` module now has a | |
| ``strptime(string, format)`` method for parsing date strings, contributed | |
| by Josh Spoerri. It uses the same format characters as :func:`time.strptime` and | |
| :func:`time.strftime`:: | |
| from datetime import datetime | |
| ts = datetime.strptime('10:13:15 2006-03-07', | |
| '%H:%M:%S %Y-%m-%d') | |
| * The :meth:`SequenceMatcher.get_matching_blocks` method in the :mod:`difflib` | |
| module now guarantees to return a minimal list of blocks describing matching | |
| subsequences. Previously, the algorithm would occasionally break a block of | |
| matching elements into two list entries. (Enhancement by Tim Peters.) | |
| * The :mod:`doctest` module gained a ``SKIP`` option that keeps an example from | |
| being executed at all. This is intended for code snippets that are usage | |
| examples intended for the reader and aren't actually test cases. | |
| An *encoding* parameter was added to the :func:`testfile` function and the | |
| :class:`DocFileSuite` class to specify the file's encoding. This makes it | |
| easier to use non-ASCII characters in tests contained within a docstring. | |
| (Contributed by Bjorn Tillenius.) | |
| .. Patch 1080727 | |
| * The :mod:`email` package has been updated to version 4.0. (Contributed by | |
| Barry Warsaw.) | |
| .. XXX need to provide some more detail here | |
| .. index:: | |
| single: universal newlines; What's new | |
| * The :mod:`fileinput` module was made more flexible. Unicode filenames are now | |
| supported, and a *mode* parameter that defaults to ``"r"`` was added to the | |
| :func:`input` function to allow opening files in binary or :term:`universal | |
| newlines` mode. Another new parameter, *openhook*, lets you use a function | |
| other than :func:`open` to open the input files. Once you're iterating over | |
| the set of files, the :class:`FileInput` object's new :meth:`fileno` returns | |
| the file descriptor for the currently opened file. (Contributed by Georg | |
| Brandl.) | |
| * In the :mod:`gc` module, the new :func:`get_count` function returns a 3-tuple | |
| containing the current collection counts for the three GC generations. This is | |
| accounting information for the garbage collector; when these counts reach a | |
| specified threshold, a garbage collection sweep will be made. The existing | |
| :func:`gc.collect` function now takes an optional *generation* argument of 0, 1, | |
| or 2 to specify which generation to collect. (Contributed by Barry Warsaw.) | |
| * The :func:`nsmallest` and :func:`nlargest` functions in the :mod:`heapq` | |
| module now support a ``key`` keyword parameter similar to the one provided by | |
| the :func:`min`/:func:`max` functions and the :meth:`sort` methods. For | |
| example:: | |
| >>> import heapq | |
| >>> L = ["short", 'medium', 'longest', 'longer still'] | |
| >>> heapq.nsmallest(2, L) # Return two lowest elements, lexicographically | |
| ['longer still', 'longest'] | |
| >>> heapq.nsmallest(2, L, key=len) # Return two shortest elements | |
| ['short', 'medium'] | |
| (Contributed by Raymond Hettinger.) | |
| * The :func:`itertools.islice` function now accepts ``None`` for the start and | |
| step arguments. This makes it more compatible with the attributes of slice | |
| objects, so that you can now write the following:: | |
| s = slice(5) # Create slice object | |
| itertools.islice(iterable, s.start, s.stop, s.step) | |
| (Contributed by Raymond Hettinger.) | |
| * The :func:`format` function in the :mod:`locale` module has been modified and | |
| two new functions were added, :func:`format_string` and :func:`currency`. | |
| The :func:`format` function's *val* parameter could previously be a string as | |
| long as no more than one %char specifier appeared; now the parameter must be | |
| exactly one %char specifier with no surrounding text. An optional *monetary* | |
| parameter was also added which, if ``True``, will use the locale's rules for | |
| formatting currency in placing a separator between groups of three digits. | |
| To format strings with multiple %char specifiers, use the new | |
| :func:`format_string` function that works like :func:`format` but also supports | |
| mixing %char specifiers with arbitrary text. | |
| A new :func:`currency` function was also added that formats a number according | |
| to the current locale's settings. | |
| (Contributed by Georg Brandl.) | |
| .. Patch 1180296 | |
| * The :mod:`mailbox` module underwent a massive rewrite to add the capability to | |
| modify mailboxes in addition to reading them. A new set of classes that include | |
| :class:`mbox`, :class:`MH`, and :class:`Maildir` are used to read mailboxes, and | |
| have an ``add(message)`` method to add messages, ``remove(key)`` to | |
| remove messages, and :meth:`lock`/:meth:`unlock` to lock/unlock the mailbox. | |
| The following example converts a maildir-format mailbox into an mbox-format | |
| one:: | |
| import mailbox | |
| # 'factory=None' uses email.Message.Message as the class representing | |
| # individual messages. | |
| src = mailbox.Maildir('maildir', factory=None) | |
| dest = mailbox.mbox('/tmp/mbox') | |
| for msg in src: | |
| dest.add(msg) | |
| (Contributed by Gregory K. Johnson. Funding was provided by Google's 2005 | |
| Summer of Code.) | |
| * New module: the :mod:`msilib` module allows creating Microsoft Installer | |
| :file:`.msi` files and CAB files. Some support for reading the :file:`.msi` | |
| database is also included. (Contributed by Martin von Löwis.) | |
| * The :mod:`nis` module now supports accessing domains other than the system | |
| default domain by supplying a *domain* argument to the :func:`nis.match` and | |
| :func:`nis.maps` functions. (Contributed by Ben Bell.) | |
| * The :mod:`operator` module's :func:`itemgetter` and :func:`attrgetter` | |
| functions now support multiple fields. A call such as | |
| ``operator.attrgetter('a', 'b')`` will return a function that retrieves the | |
| :attr:`a` and :attr:`b` attributes. Combining this new feature with the | |
| :meth:`sort` method's ``key`` parameter lets you easily sort lists using | |
| multiple fields. (Contributed by Raymond Hettinger.) | |
| * The :mod:`optparse` module was updated to version 1.5.1 of the Optik library. | |
| The :class:`OptionParser` class gained an :attr:`epilog` attribute, a string | |
| that will be printed after the help message, and a :meth:`destroy` method to | |
| break reference cycles created by the object. (Contributed by Greg Ward.) | |
| * The :mod:`os` module underwent several changes. The :attr:`stat_float_times` | |
| variable now defaults to true, meaning that :func:`os.stat` will now return time | |
| values as floats. (This doesn't necessarily mean that :func:`os.stat` will | |
| return times that are precise to fractions of a second; not all systems support | |
| such precision.) | |
| Constants named :attr:`os.SEEK_SET`, :attr:`os.SEEK_CUR`, and | |
| :attr:`os.SEEK_END` have been added; these are the parameters to the | |
| :func:`os.lseek` function. Two new constants for locking are | |
| :attr:`os.O_SHLOCK` and :attr:`os.O_EXLOCK`. | |
| Two new functions, :func:`wait3` and :func:`wait4`, were added. They're similar | |
| the :func:`waitpid` function which waits for a child process to exit and returns | |
| a tuple of the process ID and its exit status, but :func:`wait3` and | |
| :func:`wait4` return additional information. :func:`wait3` doesn't take a | |
| process ID as input, so it waits for any child process to exit and returns a | |
| 3-tuple of *process-id*, *exit-status*, *resource-usage* as returned from the | |
| :func:`resource.getrusage` function. ``wait4(pid)`` does take a process ID. | |
| (Contributed by Chad J. Schroeder.) | |
| On FreeBSD, the :func:`os.stat` function now returns times with nanosecond | |
| resolution, and the returned object now has :attr:`st_gen` and | |
| :attr:`st_birthtime`. The :attr:`st_flags` attribute is also available, if the | |
| platform supports it. (Contributed by Antti Louko and Diego Pettenò.) | |
| .. (Patch 1180695, 1212117) | |
| * The Python debugger provided by the :mod:`pdb` module can now store lists of | |
| commands to execute when a breakpoint is reached and execution stops. Once | |
| breakpoint #1 has been created, enter ``commands 1`` and enter a series of | |
| commands to be executed, finishing the list with ``end``. The command list can | |
| include commands that resume execution, such as ``continue`` or ``next``. | |
| (Contributed by Grégoire Dooms.) | |
| .. Patch 790710 | |
| * The :mod:`pickle` and :mod:`cPickle` modules no longer accept a return value | |
| of ``None`` from the :meth:`__reduce__` method; the method must return a tuple | |
| of arguments instead. The ability to return ``None`` was deprecated in Python | |
| 2.4, so this completes the removal of the feature. | |
| * The :mod:`pkgutil` module, containing various utility functions for finding | |
| packages, was enhanced to support :pep:`302`'s import hooks and now also works for | |
| packages stored in ZIP-format archives. (Contributed by Phillip J. Eby.) | |
| * The pybench benchmark suite by Marc-André Lemburg is now included in the | |
| :file:`Tools/pybench` directory. The pybench suite is an improvement on the | |
| commonly used :file:`pystone.py` program because pybench provides a more | |
| detailed measurement of the interpreter's speed. It times particular operations | |
| such as function calls, tuple slicing, method lookups, and numeric operations, | |
| instead of performing many different operations and reducing the result to a | |
| single number as :file:`pystone.py` does. | |
| * The :mod:`pyexpat` module now uses version 2.0 of the Expat parser. | |
| (Contributed by Trent Mick.) | |
| * The :class:`~queue.Queue` class provided by the :mod:`Queue` module gained two new | |
| methods. :meth:`join` blocks until all items in the queue have been retrieved | |
| and all processing work on the items have been completed. Worker threads call | |
| the other new method, :meth:`task_done`, to signal that processing for an item | |
| has been completed. (Contributed by Raymond Hettinger.) | |
| * The old :mod:`regex` and :mod:`regsub` modules, which have been deprecated | |
| ever since Python 2.0, have finally been deleted. Other deleted modules: | |
| :mod:`statcache`, :mod:`tzparse`, :mod:`whrandom`. | |
| * Also deleted: the :file:`lib-old` directory, which includes ancient modules | |
| such as :mod:`dircmp` and :mod:`ni`, was removed. :file:`lib-old` wasn't on the | |
| default ``sys.path``, so unless your programs explicitly added the directory to | |
| ``sys.path``, this removal shouldn't affect your code. | |
| * The :mod:`rlcompleter` module is no longer dependent on importing the | |
| :mod:`readline` module and therefore now works on non-Unix platforms. (Patch | |
| from Robert Kiendl.) | |
| .. Patch #1472854 | |
| * The :mod:`SimpleXMLRPCServer` and :mod:`DocXMLRPCServer` classes now have a | |
| :attr:`rpc_paths` attribute that constrains XML-RPC operations to a limited set | |
| of URL paths; the default is to allow only ``'/'`` and ``'/RPC2'``. Setting | |
| :attr:`rpc_paths` to ``None`` or an empty tuple disables this path checking. | |
| .. Bug #1473048 | |
| * The :mod:`socket` module now supports :const:`AF_NETLINK` sockets on Linux, | |
| thanks to a patch from Philippe Biondi. Netlink sockets are a Linux-specific | |
| mechanism for communications between a user-space process and kernel code; an | |
| introductory article about them is at https://www.linuxjournal.com/article/7356. | |
| In Python code, netlink addresses are represented as a tuple of 2 integers, | |
| ``(pid, group_mask)``. | |
| Two new methods on socket objects, ``recv_into(buffer)`` and | |
| ``recvfrom_into(buffer)``, store the received data in an object that | |
| supports the buffer protocol instead of returning the data as a string. This | |
| means you can put the data directly into an array or a memory-mapped file. | |
| Socket objects also gained :meth:`getfamily`, :meth:`gettype`, and | |
| :meth:`getproto` accessor methods to retrieve the family, type, and protocol | |
| values for the socket. | |
| * New module: the :mod:`spwd` module provides functions for accessing the shadow | |
| password database on systems that support shadow passwords. | |
| * The :mod:`struct` is now faster because it compiles format strings into | |
| :class:`Struct` objects with :meth:`pack` and :meth:`unpack` methods. This is | |
| similar to how the :mod:`re` module lets you create compiled regular expression | |
| objects. You can still use the module-level :func:`pack` and :func:`unpack` | |
| functions; they'll create :class:`Struct` objects and cache them. Or you can | |
| use :class:`Struct` instances directly:: | |
| s = struct.Struct('ih3s') | |
| data = s.pack(1972, 187, 'abc') | |
| year, number, name = s.unpack(data) | |
| You can also pack and unpack data to and from buffer objects directly using the | |
| ``pack_into(buffer, offset, v1, v2, ...)`` and ``unpack_from(buffer, | |
| offset)`` methods. This lets you store data directly into an array or a | |
| memory-mapped file. | |
| (:class:`Struct` objects were implemented by Bob Ippolito at the NeedForSpeed | |
| sprint. Support for buffer objects was added by Martin Blais, also at the | |
| NeedForSpeed sprint.) | |
| * The Python developers switched from CVS to Subversion during the 2.5 | |
| development process. Information about the exact build version is available as | |
| the ``sys.subversion`` variable, a 3-tuple of ``(interpreter-name, branch-name, | |
| revision-range)``. For example, at the time of writing my copy of 2.5 was | |
| reporting ``('CPython', 'trunk', '45313:45315')``. | |
| This information is also available to C extensions via the | |
| :c:func:`Py_GetBuildInfo` function that returns a string of build information | |
| like this: ``"trunk:45355:45356M, Apr 13 2006, 07:42:19"``. (Contributed by | |
| Barry Warsaw.) | |
| * Another new function, :func:`sys._current_frames`, returns the current stack | |
| frames for all running threads as a dictionary mapping thread identifiers to the | |
| topmost stack frame currently active in that thread at the time the function is | |
| called. (Contributed by Tim Peters.) | |
| * The :class:`TarFile` class in the :mod:`tarfile` module now has an | |
| :meth:`extractall` method that extracts all members from the archive into the | |
| current working directory. It's also possible to set a different directory as | |
| the extraction target, and to unpack only a subset of the archive's members. | |
| The compression used for a tarfile opened in stream mode can now be autodetected | |
| using the mode ``'r|*'``. (Contributed by Lars Gustäbel.) | |
| .. patch 918101 | |
| * The :mod:`threading` module now lets you set the stack size used when new | |
| threads are created. The ``stack_size([*size*])`` function returns the | |
| currently configured stack size, and supplying the optional *size* parameter | |
| sets a new value. Not all platforms support changing the stack size, but | |
| Windows, POSIX threading, and OS/2 all do. (Contributed by Andrew MacIntyre.) | |
| .. Patch 1454481 | |
| * The :mod:`unicodedata` module has been updated to use version 4.1.0 of the | |
| Unicode character database. Version 3.2.0 is required by some specifications, | |
| so it's still available as :attr:`unicodedata.ucd_3_2_0`. | |
| * New module: the :mod:`uuid` module generates universally unique identifiers | |
| (UUIDs) according to :rfc:`4122`. The RFC defines several different UUID | |
| versions that are generated from a starting string, from system properties, or | |
| purely randomly. This module contains a :class:`UUID` class and functions | |
| named :func:`uuid1`, :func:`uuid3`, :func:`uuid4`, and :func:`uuid5` to | |
| generate different versions of UUID. (Version 2 UUIDs are not specified in | |
| :rfc:`4122` and are not supported by this module.) :: | |
| >>> import uuid | |
| >>> # make a UUID based on the host ID and current time | |
| >>> uuid.uuid1() | |
| UUID('a8098c1a-f86e-11da-bd1a-00112444be1e') | |
| >>> # make a UUID using an MD5 hash of a namespace UUID and a name | |
| >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org') | |
| UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e') | |
| >>> # make a random UUID | |
| >>> uuid.uuid4() | |
| UUID('16fd2706-8baf-433b-82eb-8c7fada847da') | |
| >>> # make a UUID using a SHA-1 hash of a namespace UUID and a name | |
| >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org') | |
| UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d') | |
| (Contributed by Ka-Ping Yee.) | |
| * The :mod:`weakref` module's :class:`WeakKeyDictionary` and | |
| :class:`WeakValueDictionary` types gained new methods for iterating over the | |
| weak references contained in the dictionary. :meth:`iterkeyrefs` and | |
| :meth:`keyrefs` methods were added to :class:`WeakKeyDictionary`, and | |
| :meth:`itervaluerefs` and :meth:`valuerefs` were added to | |
| :class:`WeakValueDictionary`. (Contributed by Fred L. Drake, Jr.) | |
| * The :mod:`webbrowser` module received a number of enhancements. It's now | |
| usable as a script with ``python -m webbrowser``, taking a URL as the argument; | |
| there are a number of switches to control the behaviour (:option:`!-n` for a new | |
| browser window, :option:`!-t` for a new tab). New module-level functions, | |
| :func:`open_new` and :func:`open_new_tab`, were added to support this. The | |
| module's :func:`open` function supports an additional feature, an *autoraise* | |
| parameter that signals whether to raise the open window when possible. A number | |
| of additional browsers were added to the supported list such as Firefox, Opera, | |
| Konqueror, and elinks. (Contributed by Oleg Broytmann and Georg Brandl.) | |
| .. Patch #754022 | |
| * The :mod:`xmlrpclib` module now supports returning :class:`~datetime.datetime` objects | |
| for the XML-RPC date type. Supply ``use_datetime=True`` to the :func:`loads` | |
| function or the :class:`Unmarshaller` class to enable this feature. (Contributed | |
| by Skip Montanaro.) | |
| .. Patch 1120353 | |
| * The :mod:`zipfile` module now supports the ZIP64 version of the format, | |
| meaning that a .zip archive can now be larger than 4 GiB and can contain | |
| individual files larger than 4 GiB. (Contributed by Ronald Oussoren.) | |
| .. Patch 1446489 | |
| * The :mod:`zlib` module's :class:`Compress` and :class:`Decompress` objects now | |
| support a :meth:`copy` method that makes a copy of the object's internal state | |
| and returns a new :class:`Compress` or :class:`Decompress` object. | |
| (Contributed by Chris AtLee.) | |
| .. Patch 1435422 | |
| .. ====================================================================== | |
| .. _module-ctypes: | |
| The ctypes package | |
| ------------------ | |
| The :mod:`ctypes` package, written by Thomas Heller, has been added to the | |
| standard library. :mod:`ctypes` lets you call arbitrary functions in shared | |
| libraries or DLLs. Long-time users may remember the :mod:`dl` module, which | |
| provides functions for loading shared libraries and calling functions in them. | |
| The :mod:`ctypes` package is much fancier. | |
| To load a shared library or DLL, you must create an instance of the | |
| :class:`CDLL` class and provide the name or path of the shared library or DLL. | |
| Once that's done, you can call arbitrary functions by accessing them as | |
| attributes of the :class:`CDLL` object. :: | |
| import ctypes | |
| libc = ctypes.CDLL('libc.so.6') | |
| result = libc.printf("Line of output\n") | |
| Type constructors for the various C types are provided: :func:`c_int`, | |
| :func:`c_float`, :func:`c_double`, :func:`c_char_p` (equivalent to :c:type:`char | |
| \*`), and so forth. Unlike Python's types, the C versions are all mutable; you | |
| can assign to their :attr:`value` attribute to change the wrapped value. Python | |
| integers and strings will be automatically converted to the corresponding C | |
| types, but for other types you must call the correct type constructor. (And I | |
| mean *must*; getting it wrong will often result in the interpreter crashing | |
| with a segmentation fault.) | |
| You shouldn't use :func:`c_char_p` with a Python string when the C function will | |
| be modifying the memory area, because Python strings are supposed to be | |
| immutable; breaking this rule will cause puzzling bugs. When you need a | |
| modifiable memory area, use :func:`create_string_buffer`:: | |
| s = "this is a string" | |
| buf = ctypes.create_string_buffer(s) | |
| libc.strfry(buf) | |
| C functions are assumed to return integers, but you can set the :attr:`restype` | |
| attribute of the function object to change this:: | |
| >>> libc.atof('2.71828') | |
| -1783957616 | |
| >>> libc.atof.restype = ctypes.c_double | |
| >>> libc.atof('2.71828') | |
| 2.71828 | |
| :mod:`ctypes` also provides a wrapper for Python's C API as the | |
| ``ctypes.pythonapi`` object. This object does *not* release the global | |
| interpreter lock before calling a function, because the lock must be held when | |
| calling into the interpreter's code. There's a :class:`py_object()` type | |
| constructor that will create a :c:type:`PyObject \*` pointer. A simple usage:: | |
| import ctypes | |
| d = {} | |
| ctypes.pythonapi.PyObject_SetItem(ctypes.py_object(d), | |
| ctypes.py_object("abc"), ctypes.py_object(1)) | |
| # d is now {'abc', 1}. | |
| Don't forget to use :class:`py_object()`; if it's omitted you end up with a | |
| segmentation fault. | |
| :mod:`ctypes` has been around for a while, but people still write and | |
| distribution hand-coded extension modules because you can't rely on | |
| :mod:`ctypes` being present. Perhaps developers will begin to write Python | |
| wrappers atop a library accessed through :mod:`ctypes` instead of extension | |
| modules, now that :mod:`ctypes` is included with core Python. | |
| .. seealso:: | |
| http://starship.python.net/crew/theller/ctypes/ | |
| The ctypes web page, with a tutorial, reference, and FAQ. | |
| The documentation for the :mod:`ctypes` module. | |
| .. ====================================================================== | |
| .. _module-etree: | |
| The ElementTree package | |
| ----------------------- | |
| A subset of Fredrik Lundh's ElementTree library for processing XML has been | |
| added to the standard library as :mod:`xml.etree`. The available modules are | |
| :mod:`ElementTree`, :mod:`ElementPath`, and :mod:`ElementInclude` from | |
| ElementTree 1.2.6. The :mod:`cElementTree` accelerator module is also | |
| included. | |
| The rest of this section will provide a brief overview of using ElementTree. | |
| Full documentation for ElementTree is available at | |
| http://effbot.org/zone/element-index.htm. | |
| ElementTree represents an XML document as a tree of element nodes. The text | |
| content of the document is stored as the :attr:`text` and :attr:`tail` | |
| attributes of (This is one of the major differences between ElementTree and | |
| the Document Object Model; in the DOM there are many different types of node, | |
| including :class:`TextNode`.) | |
| The most commonly used parsing function is :func:`parse`, that takes either a | |
| string (assumed to contain a filename) or a file-like object and returns an | |
| :class:`ElementTree` instance:: | |
| from xml.etree import ElementTree as ET | |
| tree = ET.parse('ex-1.xml') | |
| feed = urllib.urlopen( | |
| 'http://planet.python.org/rss10.xml') | |
| tree = ET.parse(feed) | |
| Once you have an :class:`ElementTree` instance, you can call its :meth:`getroot` | |
| method to get the root :class:`Element` node. | |
| There's also an :func:`XML` function that takes a string literal and returns an | |
| :class:`Element` node (not an :class:`ElementTree`). This function provides a | |
| tidy way to incorporate XML fragments, approaching the convenience of an XML | |
| literal:: | |
| svg = ET.XML("""<svg width="10px" version="1.0"> | |
| </svg>""") | |
| svg.set('height', '320px') | |
| svg.append(elem1) | |
| Each XML element supports some dictionary-like and some list-like access | |
| methods. Dictionary-like operations are used to access attribute values, and | |
| list-like operations are used to access child nodes. | |
| +-------------------------------+--------------------------------------------+ | |
| | Operation | Result | | |
| +===============================+============================================+ | |
| | ``elem[n]`` | Returns n'th child element. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``elem[m:n]`` | Returns list of m'th through n'th child | | |
| | | elements. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``len(elem)`` | Returns number of child elements. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``list(elem)`` | Returns list of child elements. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``elem.append(elem2)`` | Adds *elem2* as a child. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``elem.insert(index, elem2)`` | Inserts *elem2* at the specified location. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``del elem[n]`` | Deletes n'th child element. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``elem.keys()`` | Returns list of attribute names. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``elem.get(name)`` | Returns value of attribute *name*. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``elem.set(name, value)`` | Sets new value for attribute *name*. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``elem.attrib`` | Retrieves the dictionary containing | | |
| | | attributes. | | |
| +-------------------------------+--------------------------------------------+ | |
| | ``del elem.attrib[name]`` | Deletes attribute *name*. | | |
| +-------------------------------+--------------------------------------------+ | |
| Comments and processing instructions are also represented as :class:`Element` | |
| nodes. To check if a node is a comment or processing instructions:: | |
| if elem.tag is ET.Comment: | |
| ... | |
| elif elem.tag is ET.ProcessingInstruction: | |
| ... | |
| To generate XML output, you should call the :meth:`ElementTree.write` method. | |
| Like :func:`parse`, it can take either a string or a file-like object:: | |
| # Encoding is US-ASCII | |
| tree.write('output.xml') | |
| # Encoding is UTF-8 | |
| f = open('output.xml', 'w') | |
| tree.write(f, encoding='utf-8') | |
| (Caution: the default encoding used for output is ASCII. For general XML work, | |
| where an element's name may contain arbitrary Unicode characters, ASCII isn't a | |
| very useful encoding because it will raise an exception if an element's name | |
| contains any characters with values greater than 127. Therefore, it's best to | |
| specify a different encoding such as UTF-8 that can handle any Unicode | |
| character.) | |
| This section is only a partial description of the ElementTree interfaces. Please | |
| read the package's official documentation for more details. | |
| .. seealso:: | |
| http://effbot.org/zone/element-index.htm | |
| Official documentation for ElementTree. | |
| .. ====================================================================== | |
| .. _module-hashlib: | |
| The hashlib package | |
| ------------------- | |
| A new :mod:`hashlib` module, written by Gregory P. Smith, has been added to | |
| replace the :mod:`md5` and :mod:`sha` modules. :mod:`hashlib` adds support for | |
| additional secure hashes (SHA-224, SHA-256, SHA-384, and SHA-512). When | |
| available, the module uses OpenSSL for fast platform optimized implementations | |
| of algorithms. | |
| The old :mod:`md5` and :mod:`sha` modules still exist as wrappers around hashlib | |
| to preserve backwards compatibility. The new module's interface is very close | |
| to that of the old modules, but not identical. The most significant difference | |
| is that the constructor functions for creating new hashing objects are named | |
| differently. :: | |
| # Old versions | |
| h = md5.md5() | |
| h = md5.new() | |
| # New version | |
| h = hashlib.md5() | |
| # Old versions | |
| h = sha.sha() | |
| h = sha.new() | |
| # New version | |
| h = hashlib.sha1() | |
| # Hash that weren't previously available | |
| h = hashlib.sha224() | |
| h = hashlib.sha256() | |
| h = hashlib.sha384() | |
| h = hashlib.sha512() | |
| # Alternative form | |
| h = hashlib.new('md5') # Provide algorithm as a string | |
| Once a hash object has been created, its methods are the same as before: | |
| ``update(string)`` hashes the specified string into the current digest | |
| state, :meth:`digest` and :meth:`hexdigest` return the digest value as a binary | |
| string or a string of hex digits, and :meth:`copy` returns a new hashing object | |
| with the same digest state. | |
| .. seealso:: | |
| The documentation for the :mod:`hashlib` module. | |
| .. ====================================================================== | |
| .. _module-sqlite: | |
| The sqlite3 package | |
| ------------------- | |
| The pysqlite module (http://www.pysqlite.org), a wrapper for the SQLite embedded | |
| database, has been added to the standard library under the package name | |
| :mod:`sqlite3`. | |
| SQLite is a C library that provides a lightweight disk-based database that | |
| doesn't require a separate server process and allows accessing the database | |
| using a nonstandard variant of the SQL query language. Some applications can use | |
| SQLite for internal data storage. It's also possible to prototype an | |
| application using SQLite and then port the code to a larger database such as | |
| PostgreSQL or Oracle. | |
| pysqlite was written by Gerhard Häring and provides a SQL interface compliant | |
| with the DB-API 2.0 specification described by :pep:`249`. | |
| If you're compiling the Python source yourself, note that the source tree | |
| doesn't include the SQLite code, only the wrapper module. You'll need to have | |
| the SQLite libraries and headers installed before compiling Python, and the | |
| build process will compile the module when the necessary headers are available. | |
| To use the module, you must first create a :class:`Connection` object that | |
| represents the database. Here the data will be stored in the | |
| :file:`/tmp/example` file:: | |
| conn = sqlite3.connect('/tmp/example') | |
| You can also supply the special name ``:memory:`` to create a database in RAM. | |
| Once you have a :class:`Connection`, you can create a :class:`Cursor` object | |
| and call its :meth:`execute` method to perform SQL commands:: | |
| c = conn.cursor() | |
| # Create table | |
| c.execute('''create table stocks | |
| (date text, trans text, symbol text, | |
| qty real, price real)''') | |
| # Insert a row of data | |
| c.execute("""insert into stocks | |
| values ('2006-01-05','BUY','RHAT',100,35.14)""") | |
| Usually your SQL operations will need to use values from Python variables. You | |
| shouldn't assemble your query using Python's string operations because doing so | |
| is insecure; it makes your program vulnerable to an SQL injection attack. | |
| Instead, use the DB-API's parameter substitution. Put ``?`` as a placeholder | |
| wherever you want to use a value, and then provide a tuple of values as the | |
| second argument to the cursor's :meth:`execute` method. (Other database modules | |
| may use a different placeholder, such as ``%s`` or ``:1``.) For example:: | |
| # Never do this -- insecure! | |
| symbol = 'IBM' | |
| c.execute("... where symbol = '%s'" % symbol) | |
| # Do this instead | |
| t = (symbol,) | |
| c.execute('select * from stocks where symbol=?', t) | |
| # Larger example | |
| for t in (('2006-03-28', 'BUY', 'IBM', 1000, 45.00), | |
| ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), | |
| ('2006-04-06', 'SELL', 'IBM', 500, 53.00), | |
| ): | |
| c.execute('insert into stocks values (?,?,?,?,?)', t) | |
| To retrieve data after executing a SELECT statement, you can either treat the | |
| cursor as an iterator, call the cursor's :meth:`fetchone` method to retrieve a | |
| single matching row, or call :meth:`fetchall` to get a list of the matching | |
| rows. | |
| This example uses the iterator form:: | |
| >>> c = conn.cursor() | |
| >>> c.execute('select * from stocks order by price') | |
| >>> for row in c: | |
| ... print row | |
| ... | |
| (u'2006-01-05', u'BUY', u'RHAT', 100, 35.140000000000001) | |
| (u'2006-03-28', u'BUY', u'IBM', 1000, 45.0) | |
| (u'2006-04-06', u'SELL', u'IBM', 500, 53.0) | |
| (u'2006-04-05', u'BUY', u'MSOFT', 1000, 72.0) | |
| >>> | |
| For more information about the SQL dialect supported by SQLite, see | |
| https://www.sqlite.org. | |
| .. seealso:: | |
| http://www.pysqlite.org | |
| The pysqlite web page. | |
| https://www.sqlite.org | |
| The SQLite web page; the documentation describes the syntax and the available | |
| data types for the supported SQL dialect. | |
| The documentation for the :mod:`sqlite3` module. | |
| :pep:`249` - Database API Specification 2.0 | |
| PEP written by Marc-André Lemburg. | |
| .. ====================================================================== | |
| .. _module-wsgiref: | |
| The wsgiref package | |
| ------------------- | |
| The Web Server Gateway Interface (WSGI) v1.0 defines a standard interface | |
| between web servers and Python web applications and is described in :pep:`333`. | |
| The :mod:`wsgiref` package is a reference implementation of the WSGI | |
| specification. | |
| .. XXX should this be in a :pep:`333` section instead? | |
| The package includes a basic HTTP server that will run a WSGI application; this | |
| server is useful for debugging but isn't intended for production use. Setting | |
| up a server takes only a few lines of code:: | |
| from wsgiref import simple_server | |
| wsgi_app = ... | |
| host = '' | |
| port = 8000 | |
| httpd = simple_server.make_server(host, port, wsgi_app) | |
| httpd.serve_forever() | |
| .. XXX discuss structure of WSGI applications? | |
| .. XXX provide an example using Django or some other framework? | |
| .. seealso:: | |
| http://www.wsgi.org | |
| A central web site for WSGI-related resources. | |
| :pep:`333` - Python Web Server Gateway Interface v1.0 | |
| PEP written by Phillip J. Eby. | |
| .. ====================================================================== | |
| .. _build-api: | |
| Build and C API Changes | |
| ======================= | |
| Changes to Python's build process and to the C API include: | |
| * The Python source tree was converted from CVS to Subversion, in a complex | |
| migration procedure that was supervised and flawlessly carried out by Martin von | |
| Löwis. The procedure was developed as :pep:`347`. | |
| * Coverity, a company that markets a source code analysis tool called Prevent, | |
| provided the results of their examination of the Python source code. The | |
| analysis found about 60 bugs that were quickly fixed. Many of the bugs were | |
| refcounting problems, often occurring in error-handling code. See | |
| https://scan.coverity.com for the statistics. | |
| * The largest change to the C API came from :pep:`353`, which modifies the | |
| interpreter to use a :c:type:`Py_ssize_t` type definition instead of | |
| :c:type:`int`. See the earlier section :ref:`pep-353` for a discussion of this | |
| change. | |
| * The design of the bytecode compiler has changed a great deal, no longer | |
| generating bytecode by traversing the parse tree. Instead the parse tree is | |
| converted to an abstract syntax tree (or AST), and it is the abstract syntax | |
| tree that's traversed to produce the bytecode. | |
| It's possible for Python code to obtain AST objects by using the | |
| :func:`compile` built-in and specifying ``_ast.PyCF_ONLY_AST`` as the value of | |
| the *flags* parameter:: | |
| from _ast import PyCF_ONLY_AST | |
| ast = compile("""a=0 | |
| for i in range(10): | |
| a += i | |
| """, "<string>", 'exec', PyCF_ONLY_AST) | |
| assignment = ast.body[0] | |
| for_loop = ast.body[1] | |
| No official documentation has been written for the AST code yet, but :pep:`339` | |
| discusses the design. To start learning about the code, read the definition of | |
| the various AST nodes in :file:`Parser/Python.asdl`. A Python script reads this | |
| file and generates a set of C structure definitions in | |
| :file:`Include/Python-ast.h`. The :c:func:`PyParser_ASTFromString` and | |
| :c:func:`PyParser_ASTFromFile`, defined in :file:`Include/pythonrun.h`, take | |
| Python source as input and return the root of an AST representing the contents. | |
| This AST can then be turned into a code object by :c:func:`PyAST_Compile`. For | |
| more information, read the source code, and then ask questions on python-dev. | |
| The AST code was developed under Jeremy Hylton's management, and implemented by | |
| (in alphabetical order) Brett Cannon, Nick Coghlan, Grant Edwards, John | |
| Ehresman, Kurt Kaiser, Neal Norwitz, Tim Peters, Armin Rigo, and Neil | |
| Schemenauer, plus the participants in a number of AST sprints at conferences | |
| such as PyCon. | |
| .. List of names taken from Jeremy's python-dev post at | |
| .. https://mail.python.org/pipermail/python-dev/2005-October/057500.html | |
| * Evan Jones's patch to obmalloc, first described in a talk at PyCon DC 2005, | |
| was applied. Python 2.4 allocated small objects in 256K-sized arenas, but never | |
| freed arenas. With this patch, Python will free arenas when they're empty. The | |
| net effect is that on some platforms, when you allocate many objects, Python's | |
| memory usage may actually drop when you delete them and the memory may be | |
| returned to the operating system. (Implemented by Evan Jones, and reworked by | |
| Tim Peters.) | |
| Note that this change means extension modules must be more careful when | |
| allocating memory. Python's API has many different functions for allocating | |
| memory that are grouped into families. For example, :c:func:`PyMem_Malloc`, | |
| :c:func:`PyMem_Realloc`, and :c:func:`PyMem_Free` are one family that allocates | |
| raw memory, while :c:func:`PyObject_Malloc`, :c:func:`PyObject_Realloc`, and | |
| :c:func:`PyObject_Free` are another family that's supposed to be used for | |
| creating Python objects. | |
| Previously these different families all reduced to the platform's | |
| :c:func:`malloc` and :c:func:`free` functions. This meant it didn't matter if | |
| you got things wrong and allocated memory with the :c:func:`PyMem` function but | |
| freed it with the :c:func:`PyObject` function. With 2.5's changes to obmalloc, | |
| these families now do different things and mismatches will probably result in a | |
| segfault. You should carefully test your C extension modules with Python 2.5. | |
| * The built-in set types now have an official C API. Call :c:func:`PySet_New` | |
| and :c:func:`PyFrozenSet_New` to create a new set, :c:func:`PySet_Add` and | |
| :c:func:`PySet_Discard` to add and remove elements, and :c:func:`PySet_Contains` | |
| and :c:func:`PySet_Size` to examine the set's state. (Contributed by Raymond | |
| Hettinger.) | |
| * C code can now obtain information about the exact revision of the Python | |
| interpreter by calling the :c:func:`Py_GetBuildInfo` function that returns a | |
| string of build information like this: ``"trunk:45355:45356M, Apr 13 2006, | |
| 07:42:19"``. (Contributed by Barry Warsaw.) | |
| * Two new macros can be used to indicate C functions that are local to the | |
| current file so that a faster calling convention can be used. | |
| ``Py_LOCAL(type)`` declares the function as returning a value of the | |
| specified *type* and uses a fast-calling qualifier. | |
| ``Py_LOCAL_INLINE(type)`` does the same thing and also requests the | |
| function be inlined. If :c:func:`PY_LOCAL_AGGRESSIVE` is defined before | |
| :file:`python.h` is included, a set of more aggressive optimizations are enabled | |
| for the module; you should benchmark the results to find out if these | |
| optimizations actually make the code faster. (Contributed by Fredrik Lundh at | |
| the NeedForSpeed sprint.) | |
| * ``PyErr_NewException(name, base, dict)`` can now accept a tuple of base | |
| classes as its *base* argument. (Contributed by Georg Brandl.) | |
| * The :c:func:`PyErr_Warn` function for issuing warnings is now deprecated in | |
| favour of ``PyErr_WarnEx(category, message, stacklevel)`` which lets you | |
| specify the number of stack frames separating this function and the caller. A | |
| *stacklevel* of 1 is the function calling :c:func:`PyErr_WarnEx`, 2 is the | |
| function above that, and so forth. (Added by Neal Norwitz.) | |
| * The CPython interpreter is still written in C, but the code can now be | |
| compiled with a C++ compiler without errors. (Implemented by Anthony Baxter, | |
| Martin von Löwis, Skip Montanaro.) | |
| * The :c:func:`PyRange_New` function was removed. It was never documented, never | |
| used in the core code, and had dangerously lax error checking. In the unlikely | |
| case that your extensions were using it, you can replace it by something like | |
| the following:: | |
| range = PyObject_CallFunction((PyObject*) &PyRange_Type, "lll", | |
| start, stop, step); | |
| .. ====================================================================== | |
| .. _ports: | |
| Port-Specific Changes | |
| --------------------- | |
| * MacOS X (10.3 and higher): dynamic loading of modules now uses the | |
| :c:func:`dlopen` function instead of MacOS-specific functions. | |
| * MacOS X: an :option:`!--enable-universalsdk` switch was added to the | |
| :program:`configure` script that compiles the interpreter as a universal binary | |
| able to run on both PowerPC and Intel processors. (Contributed by Ronald | |
| Oussoren; :issue:`2573`.) | |
| * Windows: :file:`.dll` is no longer supported as a filename extension for | |
| extension modules. :file:`.pyd` is now the only filename extension that will be | |
| searched for. | |
| .. ====================================================================== | |
| .. _porting: | |
| Porting to Python 2.5 | |
| ===================== | |
| This section lists previously described changes that may require changes to your | |
| code: | |
| * ASCII is now the default encoding for modules. It's now a syntax error if a | |
| module contains string literals with 8-bit characters but doesn't have an | |
| encoding declaration. In Python 2.4 this triggered a warning, not a syntax | |
| error. | |
| * Previously, the :attr:`gi_frame` attribute of a generator was always a frame | |
| object. Because of the :pep:`342` changes described in section :ref:`pep-342`, | |
| it's now possible for :attr:`gi_frame` to be ``None``. | |
| * A new warning, :class:`UnicodeWarning`, is triggered when you attempt to | |
| compare a Unicode string and an 8-bit string that can't be converted to Unicode | |
| using the default ASCII encoding. Previously such comparisons would raise a | |
| :class:`UnicodeDecodeError` exception. | |
| * Library: the :mod:`csv` module is now stricter about multi-line quoted fields. | |
| If your files contain newlines embedded within fields, the input should be split | |
| into lines in a manner which preserves the newline characters. | |
| * Library: the :mod:`locale` module's :func:`format` function's would | |
| previously accept any string as long as no more than one %char specifier | |
| appeared. In Python 2.5, the argument must be exactly one %char specifier with | |
| no surrounding text. | |
| * Library: The :mod:`pickle` and :mod:`cPickle` modules no longer accept a | |
| return value of ``None`` from the :meth:`__reduce__` method; the method must | |
| return a tuple of arguments instead. The modules also no longer accept the | |
| deprecated *bin* keyword parameter. | |
| * Library: The :mod:`SimpleXMLRPCServer` and :mod:`DocXMLRPCServer` classes now | |
| have a :attr:`rpc_paths` attribute that constrains XML-RPC operations to a | |
| limited set of URL paths; the default is to allow only ``'/'`` and ``'/RPC2'``. | |
| Setting :attr:`rpc_paths` to ``None`` or an empty tuple disables this path | |
| checking. | |
| * C API: Many functions now use :c:type:`Py_ssize_t` instead of :c:type:`int` to | |
| allow processing more data on 64-bit machines. Extension code may need to make | |
| the same change to avoid warnings and to support 64-bit machines. See the | |
| earlier section :ref:`pep-353` for a discussion of this change. | |
| * C API: The obmalloc changes mean that you must be careful to not mix usage | |
| of the :c:func:`PyMem_\*` and :c:func:`PyObject_\*` families of functions. Memory | |
| allocated with one family's :c:func:`\*_Malloc` must be freed with the | |
| corresponding family's :c:func:`\*_Free` function. | |
| .. ====================================================================== | |
| Acknowledgements | |
| ================ | |
| The author would like to thank the following people for offering suggestions, | |
| corrections and assistance with various drafts of this article: Georg Brandl, | |
| Nick Coghlan, Phillip J. Eby, Lars Gustäbel, Raymond Hettinger, Ralf W. | |
| Grosse-Kunstleve, Kent Johnson, Iain Lowe, Martin von Löwis, Fredrik Lundh, Andrew | |
| McNamara, Skip Montanaro, Gustavo Niemeyer, Paul Prescod, James Pryor, Mike | |
| Rovner, Scott Weikart, Barry Warsaw, Thomas Wouters. | |