Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 1 | **************************** |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 2 | What's New In Python 3.1 |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 3 | **************************** |
| 4 | |
| 5 | .. XXX Add trademark info for Apple, Microsoft. |
| 6 | |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 7 | :Author: Raymond Hettinger |
Benjamin Peterson | 3432829 | 2008-12-05 03:05:29 +0000 | [diff] [blame] | 8 | :Release: |release| |
| 9 | :Date: |today| |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 10 | |
| 11 | .. $Id$ |
| 12 | Rules for maintenance: |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 13 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 14 | * Anyone can add text to this document. Do not spend very much time |
| 15 | on the wording of your changes, because your text will probably |
| 16 | get rewritten to some degree. |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 17 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 18 | * The maintainer will go through Misc/NEWS periodically and add |
| 19 | changes; it's therefore more important to add your changes to |
| 20 | Misc/NEWS than to this file. (Note: I didn't get to this for 3.0. |
| 21 | GvR.) |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 22 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 23 | * This is not a complete list of every single change; completeness |
| 24 | is the purpose of Misc/NEWS. Some changes I consider too small |
| 25 | or esoteric to include. If such a change is added to the text, |
| 26 | I'll just remove it. (This is another reason you shouldn't spend |
| 27 | too much time on writing your addition.) |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 28 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 29 | * If you want to draw your new text to the attention of the |
| 30 | maintainer, add 'XXX' to the beginning of the paragraph or |
| 31 | section. |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 32 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 33 | * It's OK to just add a fragmentary note about a change. For |
| 34 | example: "XXX Describe the transmogrify() function added to the |
| 35 | socket module." The maintainer will research the change and |
| 36 | write the necessary text. |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 37 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 38 | * You can comment out your additions if you like, but it's not |
| 39 | necessary (especially when a final release is some months away). |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 40 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 41 | * Credit the author of a patch or bugfix. Just the name is |
| 42 | sufficient; the e-mail address isn't necessary. (Due to time |
| 43 | constraints I haven't managed to do this for 3.0. GvR.) |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 44 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 45 | * It's helpful to add the bug/patch number as a comment: |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 46 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 47 | % Patch 12345 |
| 48 | XXX Describe the transmogrify() function added to the socket |
| 49 | module. |
| 50 | (Contributed by P.Y. Developer.) |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 51 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 52 | This saves the maintainer the effort of going through the SVN log |
| 53 | when researching a change. (Again, I didn't get to this for 3.0. |
| 54 | GvR.) |
| 55 | |
| 56 | This article explains the new features in Python 3.1, compared to 3.0. |
| 57 | |
| 58 | .. Compare with previous release in 2 - 3 sentences here. |
| 59 | .. add hyperlink when the documentation becomes available online. |
| 60 | |
| 61 | .. ====================================================================== |
| 62 | .. Large, PEP-level features and changes should be described here. |
| 63 | .. Should there be a new section here for 3k migration? |
| 64 | .. Or perhaps a more general section describing module changes/deprecation? |
| 65 | .. sets module deprecated |
| 66 | .. ====================================================================== |
| 67 | |
| 68 | |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 69 | PEP 372: Ordered Dictionaries |
| 70 | ============================= |
| 71 | |
| 72 | Regular Python dictionaries iterate over key/value pairs in arbitrary order. |
| 73 | Over the years, a number of authors have written alternative implementations |
| 74 | that remember the order that the keys were originally inserted. Based on |
| 75 | the experiences from those implementations, the :mod:`collections` module |
| 76 | now has an :class:`OrderedDict` class. |
| 77 | |
| 78 | The OrderedDict API is substantially the same as regular dictionaries |
| 79 | but will iterate over keys and values in a guaranteed order depending on |
| 80 | when a key was first inserted. If a new entry overwrites an existing entry, |
| 81 | the original insertion position is left unchanged. Deleting an entry and |
| 82 | reinserting it will move it to the end. |
| 83 | |
| 84 | The standard library now supports use of ordered dictionaries in several |
Raymond Hettinger | c4f6d29 | 2009-04-04 12:35:58 +0000 | [diff] [blame] | 85 | modules. The :mod:`ConfigParser` module uses them by default. This lets |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 86 | configuration files be read, modified, and then written back in their original |
| 87 | order. The :mod:`collections` module's :meth:`namedtuple._asdict` method now |
Raymond Hettinger | c4f6d29 | 2009-04-04 12:35:58 +0000 | [diff] [blame] | 88 | returns an ordered dictionary with the values appearing in the same order as |
| 89 | the underlying tuple indicies. The :mod:`json` module is being built-out with |
| 90 | an *object_pairs_hook* to allow OrderedDicts to be built by the decoder. |
Raymond Hettinger | f41857e | 2009-04-04 11:59:00 +0000 | [diff] [blame] | 91 | Support was also added for third-party tools like PyYAML. |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 92 | |
| 93 | .. seealso:: |
| 94 | |
| 95 | :pep:`372` - Ordered Dictionaries |
Raymond Hettinger | f84dfe5 | 2009-04-04 13:13:56 +0000 | [diff] [blame] | 96 | PEP written by Armin Ronacher and Raymond Hettinger. Implementation |
| 97 | written by Raymond Hettinger. |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 98 | |
| 99 | PEP 378: Format Specifier for Thousands Separator |
| 100 | ================================================= |
| 101 | |
| 102 | The builtin :func:`format` function and the :meth:`str.format` method use |
| 103 | a mini-language that now includes a simple, non-locale aware way to format |
| 104 | a number with a thousands separator. That provides a way to humanize a |
| 105 | program's output, improving its professional appearance and readability:: |
| 106 | |
| 107 | >>> format(Decimal('1234567.89'), ',f') |
| 108 | '1,234,567.89' |
| 109 | |
Raymond Hettinger | c4f6d29 | 2009-04-04 12:35:58 +0000 | [diff] [blame] | 110 | The currently supported types are :class:`int` and :class:`decimal.Decimal`. |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 111 | Support for :class:`float` is expected before the beta release. |
| 112 | Discussions are underway about how to specify alternative separators |
Raymond Hettinger | c4f6d29 | 2009-04-04 12:35:58 +0000 | [diff] [blame] | 113 | like dots, spaces, apostrophes, or underscores. Locale-aware applications |
| 114 | should use the existing *n* format specifier which already has some support |
| 115 | for thousands separators. |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 116 | |
| 117 | .. seealso:: |
| 118 | |
| 119 | :pep:`378` - Format Specifier for Thousands Separator |
| 120 | PEP written by Raymond Hettinger; implemented by Eric Smith and |
| 121 | Mark Dickinson. |
| 122 | |
| 123 | |
Mark Dickinson | 54bc1ec | 2008-12-17 16:19:07 +0000 | [diff] [blame] | 124 | Other Language Changes |
| 125 | ====================== |
| 126 | |
| 127 | Some smaller changes made to the core Python language are: |
| 128 | |
| 129 | * The :func:`int` type gained a ``bit_length`` method that returns the |
| 130 | number of bits necessary to represent its argument in binary:: |
| 131 | |
| 132 | >>> n = 37 |
| 133 | >>> bin(37) |
| 134 | '0b100101' |
| 135 | >>> n.bit_length() |
| 136 | 6 |
| 137 | >>> n = 2**123-1 |
| 138 | >>> n.bit_length() |
| 139 | 123 |
| 140 | >>> (n+1).bit_length() |
| 141 | 124 |
| 142 | |
Raymond Hettinger | c4f6d29 | 2009-04-04 12:35:58 +0000 | [diff] [blame] | 143 | (Contributed by Fredrik Johansson, Victor Stinner, Raymond Hettinger, |
| 144 | and Mark Dickinson; :issue:`3439`.) |
Mark Dickinson | 54bc1ec | 2008-12-17 16:19:07 +0000 | [diff] [blame] | 145 | |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 146 | * Added a :class:`collections.Counter` class to support convenient |
| 147 | counting of unique items in a sequence or iterable:: |
| 148 | |
| 149 | >>> Counter(['red', 'blue', 'red', 'green', 'blue', 'blue']) |
| 150 | Counter({'blue': 3, 'red': 2, 'green': 1}) |
| 151 | |
| 152 | (Contributed by Raymond Hettinger; :issue:`1696199`.) |
| 153 | |
Raymond Hettinger | c1bd49a | 2009-04-06 23:11:08 +0000 | [diff] [blame] | 154 | * Added a new module, :mod:`tkinter.ttk` for access to the Tk themed widget set. |
Raymond Hettinger | dbd51b5 | 2009-04-06 22:45:52 +0000 | [diff] [blame] | 155 | The basic idea of ttk is to separate, to the extent possible, the code |
Raymond Hettinger | f84dfe5 | 2009-04-04 13:13:56 +0000 | [diff] [blame] | 156 | implementing a widget's behavior from the code implementing its appearance. |
| 157 | |
| 158 | (Contributed by Kevin Walzer and Guilherme Polo; :issue:`2618` and |
| 159 | :issue:`2983`.) |
| 160 | |
Raymond Hettinger | f4cc2c4 | 2009-04-06 22:39:03 +0000 | [diff] [blame] | 161 | * The :class:`gzip.GzipFile` and :class:`bz2.BZ2File` classes now support |
| 162 | the context manager protocol:: |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 163 | |
Raymond Hettinger | f4cc2c4 | 2009-04-06 22:39:03 +0000 | [diff] [blame] | 164 | >>> # Automatically close file after writing |
| 165 | >>> with gzip.GzipFile(filename, "wb") as f: |
| 166 | ... f.write(b"xxx") |
| 167 | |
| 168 | (Contributed by Antoine Pitrou.) |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 169 | |
Raymond Hettinger | 76efa2b | 2009-04-06 23:11:47 +0000 | [diff] [blame^] | 170 | * The :mod:`decimal.Decimal` module now supports methods for creating a |
| 171 | decimal object from a binary :class:`float`. The conversion is |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 172 | exact but can sometimes be surprising:: |
| 173 | |
| 174 | >>> Decimal.from_float(1.1) |
| 175 | Decimal('1.100000000000000088817841970012523233890533447265625') |
| 176 | |
| 177 | The long decimal result shows the actual binary fraction being |
| 178 | stored for *1.1*. The fraction has many digits because *1.1* cannot |
| 179 | be exactly represented in binary. |
| 180 | |
| 181 | (Contributed by Raymond Hettinger and Mark Dickinson.) |
| 182 | |
Raymond Hettinger | e7ec57d | 2009-04-04 11:08:48 +0000 | [diff] [blame] | 183 | * The fields in :func:`format` strings can now be automatically |
| 184 | numbered:: |
| 185 | |
| 186 | >>> 'Sir {} of {}'.format('Gallahad', 'Camelot') |
| 187 | 'Sir Gallahad of Camelot' |
| 188 | |
| 189 | Formerly, the string would have required numbered fields such as: |
| 190 | ``'Sir {0} of {1}'``. |
| 191 | |
| 192 | (Contributed by Eric Smith; :issue:`5237`.) |
| 193 | |
| 194 | * The :mod:`itertools` module grew two new functions. The |
| 195 | :func:`itertools.combinations_with_replacement` function is one of |
| 196 | four for generating combinatorics including permutations and Cartesian |
| 197 | products. The :func:`itertools.compress` function mimics its namesake |
| 198 | from APL. Also, the existing :func:`itertools.count` function now has |
| 199 | an optional *step* argument and can accept any type of counting |
| 200 | sequence including :class:`fractions.Fraction` and |
Raymond Hettinger | 8d97ccb | 2009-04-06 17:55:05 +0000 | [diff] [blame] | 201 | :class:`decimal.Decimal`:: |
| 202 | |
| 203 | >>> [p+q for p,q in combinations_with_replacement('LOVE', 2)] |
| 204 | ['LL', 'LO', 'LV', 'LE', 'OO', 'OV', 'OE', 'VV', 'VE', 'EE'] |
| 205 | |
| 206 | >>> list(compress(data=range(10), selectors=[0,0,1,1,0,1,0,1,0,0])) |
| 207 | [2, 3, 5, 7] |
| 208 | |
| 209 | >>> c = count(start=Fraction(1,2), step=Fraction(1,6)) |
| 210 | >>> next(c), next(c), next(c), next(c) |
| 211 | (Fraction(1, 2), Fraction(2, 3), Fraction(5, 6), Fraction(1, 1)) |
Raymond Hettinger | e7ec57d | 2009-04-04 11:08:48 +0000 | [diff] [blame] | 212 | |
| 213 | (Contributed by Raymond Hettinger.) |
| 214 | |
Raymond Hettinger | f41857e | 2009-04-04 11:59:00 +0000 | [diff] [blame] | 215 | * :func:`collections.namedtuple` now supports a keyword argument |
| 216 | *rename* which lets invalid fieldnames be automatically converted to |
| 217 | positional names in the form _0, _1, etc. This is useful when |
| 218 | the field names are being created by an external source such as a |
| 219 | CSV header, SQL field list, or user input. |
| 220 | |
| 221 | (Contributed by Raymond Hettinger; :issue:`1818`.) |
| 222 | |
Raymond Hettinger | 8d97ccb | 2009-04-06 17:55:05 +0000 | [diff] [blame] | 223 | * ``round(x, n)`` now returns an integer if *x* is an integer. |
| 224 | Previously it returned a float:: |
| 225 | |
| 226 | >>> round(1123, -2) |
| 227 | 1100 |
Raymond Hettinger | f41857e | 2009-04-04 11:59:00 +0000 | [diff] [blame] | 228 | |
| 229 | (Contributed by Mark Dickinson; :issue:`4707`.) |
| 230 | |
| 231 | * The :func:`re.sub`, :func:`re.subn` and :func:`re.split` functions now |
| 232 | accept a flags parameter. |
| 233 | |
| 234 | (Contributed by Gregory Smith.) |
| 235 | |
| 236 | * The :mod:`runpy` module which supports the ``-m`` command line switch |
| 237 | now supports the execution of packages by looking for and executing |
| 238 | a ``__main__`` submodule when a package name is supplied. |
| 239 | |
| 240 | (Contributed by Andi Vajda; :issue:`4195`.) |
| 241 | |
| 242 | * The :mod:`pdb` module can now access and display source code loaded via |
| 243 | :mod:`zipimport` (or any other conformant :pep:`302` loader). |
| 244 | |
| 245 | (Contributed by Alexander Belopolsky; :issue:`4201`.) |
| 246 | |
| 247 | * :class:`functools.partial` objects can now be pickled. |
| 248 | |
| 249 | (Suggested by Antoine Pitrou and Jesse Noller. Implemented by |
| 250 | Jack Diedrich; :issue:`5228`.) |
| 251 | |
Raymond Hettinger | 8e33051 | 2009-04-04 13:20:55 +0000 | [diff] [blame] | 252 | * Add :mod:`pydoc` help topics for symbols so that ``help('@')`` |
| 253 | works as expected in the interactive environment. |
| 254 | |
| 255 | (Contributed by David Laban; :issue:`4739`.) |
| 256 | |
Raymond Hettinger | c4f6d29 | 2009-04-04 12:35:58 +0000 | [diff] [blame] | 257 | * The :mod:`unittest` module now supports skipping individual tests or classes |
| 258 | of tests. And it supports marking a test as a expected failure, a test that |
Raymond Hettinger | 8daab40 | 2009-04-04 13:01:19 +0000 | [diff] [blame] | 259 | is known to be broken, but shouldn't be counted as a failure on a |
Raymond Hettinger | 8d97ccb | 2009-04-06 17:55:05 +0000 | [diff] [blame] | 260 | TestResult:: |
| 261 | |
| 262 | class TestGizmo(unittest.TestCase): |
| 263 | |
| 264 | @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows") |
| 265 | def test_gizmo_on_windows(self): |
| 266 | ... |
| 267 | |
| 268 | @unittest.expectedFailure |
| 269 | def test_gimzo_without_required_library(self): |
| 270 | ... |
Raymond Hettinger | f41857e | 2009-04-04 11:59:00 +0000 | [diff] [blame] | 271 | |
Raymond Hettinger | c4f6d29 | 2009-04-04 12:35:58 +0000 | [diff] [blame] | 272 | (Contributed by Benjamin Peterson.) |
| 273 | |
| 274 | * A new module, :mod:`importlib` was added. It provides a complete, portable, |
| 275 | pure Python reference implementation of the *import* statement and its |
Benjamin Peterson | 3fa0fb4 | 2009-04-04 12:42:53 +0000 | [diff] [blame] | 276 | counterpart, the :func:`__import__` function. It represents a substantial |
Raymond Hettinger | c4f6d29 | 2009-04-04 12:35:58 +0000 | [diff] [blame] | 277 | step forward in documenting and defining the actions that take place during |
| 278 | imports. |
| 279 | |
| 280 | (Contributed by Brett Cannon.) |
Raymond Hettinger | 1f251a0 | 2009-04-04 10:47:35 +0000 | [diff] [blame] | 281 | |
Georg Brandl | c47408a | 2008-12-04 18:44:53 +0000 | [diff] [blame] | 282 | .. ====================================================================== |
Antoine Pitrou | b556452 | 2009-03-28 19:45:26 +0000 | [diff] [blame] | 283 | |
| 284 | |
| 285 | Optimizations |
| 286 | ------------- |
| 287 | |
| 288 | Major performance enhancements have been added: |
| 289 | |
| 290 | * The new I/O library (as defined in :pep:`3116`) was mostly written in |
| 291 | Python and quickly proved to be a problematic bottleneck in Python 3.0. |
| 292 | In Python 3.1, the I/O library has been entirely rewritten in C and is |
| 293 | 2 to 20 times faster depending on the task at hand. The pure Python |
| 294 | version is still available for experimentation purposes through |
| 295 | the ``_pyio`` module. |
| 296 | |
| 297 | (Contributed by Amaury Forgeot d'Arc and Antoine Pitrou.) |
| 298 | |
Raymond Hettinger | 8daab40 | 2009-04-04 13:01:19 +0000 | [diff] [blame] | 299 | * Added a heuristic so that tuples and dicts containing only untrackable objects |
Raymond Hettinger | e7ec57d | 2009-04-04 11:08:48 +0000 | [diff] [blame] | 300 | are not tracked by the garbage collector. This can reduce the size of |
| 301 | collections and therefore the garbage collection overhead on long-running |
| 302 | programs, depending on their particular use of datatypes. |
| 303 | |
| 304 | (Contributed by Antoine Pitrou, :issue:`4688`.) |
| 305 | |
Raymond Hettinger | f41857e | 2009-04-04 11:59:00 +0000 | [diff] [blame] | 306 | * Enabling a configure option named ``--with-computed-gotos`` |
| 307 | on compilers that support it (notably: gcc, SunPro, icc), the bytecode |
| 308 | evaluation loop is compiled with a new dispatch mechanism which gives |
Raymond Hettinger | 2a02777 | 2009-04-04 12:46:57 +0000 | [diff] [blame] | 309 | speedups of up to 20%, depending on the system, the compiler, and |
| 310 | the benchmark. |
Raymond Hettinger | f41857e | 2009-04-04 11:59:00 +0000 | [diff] [blame] | 311 | |
Raymond Hettinger | 2a02777 | 2009-04-04 12:46:57 +0000 | [diff] [blame] | 312 | (Contributed by Antoine Pitrou along with a number of other participants, |
| 313 | :issue:`4753`). |
Raymond Hettinger | f41857e | 2009-04-04 11:59:00 +0000 | [diff] [blame] | 314 | |
| 315 | * The decoding of UTF-8, UTF-16 and LATIN-1 is now two to four times |
| 316 | faster. |
| 317 | |
| 318 | (Contributed by Antoine Pitrou and Amaury Forgeot d'Arc, :issue:`4868`.) |
| 319 | |
Raymond Hettinger | c4f6d29 | 2009-04-04 12:35:58 +0000 | [diff] [blame] | 320 | * The :mod:`json` module is getting a C extension to substantially improve |
| 321 | its performance. The code is expected to be added in-time for the beta |
| 322 | release. |
| 323 | |
| 324 | (Contributed by Bob Ippolito.) |
| 325 | |
| 326 | * Integers are now stored internally either in base 2**15 or in base |
| 327 | 2**30, the base being determined at build time. Previously, they |
| 328 | were always stored in base 2**15. Using base 2**30 gives |
| 329 | significant performance improvements on 64-bit machines, but |
| 330 | benchmark results on 32-bit machines have been mixed. Therefore, |
| 331 | the default is to use base 2**30 on 64-bit machines and base 2**15 |
| 332 | on 32-bit machines; on Unix, there's a new configure option |
| 333 | ``--enable-big-digits`` that can be used to override this default. |
| 334 | |
| 335 | Apart from the performance improvements this change should be invisible to |
| 336 | end users, with one exception: for testing and debugging purposes there's a |
| 337 | new :class:`structseq` ``sys.int_info`` that provides information about the |
| 338 | internal format, giving the number of bits per digit and the size in bytes |
| 339 | of the C type used to store each digit:: |
| 340 | |
| 341 | >>> import sys |
| 342 | >>> sys.int_info |
| 343 | sys.int_info(bits_per_digit=30, sizeof_digit=4) |
| 344 | |
| 345 | (Contributed by Mark Dickinson; :issue:`4258`.) |
Antoine Pitrou | b556452 | 2009-03-28 19:45:26 +0000 | [diff] [blame] | 346 | |
| 347 | .. ====================================================================== |