You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

759 lines
27 KiB

Merged revisions 59259-59274 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r59260 | lars.gustaebel | 2007-12-01 22:02:12 +0100 (Sat, 01 Dec 2007) | 5 lines Issue #1531: Read fileobj from the current offset, do not seek to the start. (will backport to 2.5) ........ r59262 | georg.brandl | 2007-12-01 23:24:47 +0100 (Sat, 01 Dec 2007) | 4 lines Document PyEval_* functions from ceval.c. Credits to Michael Sloan from GHOP. ........ r59263 | georg.brandl | 2007-12-01 23:27:56 +0100 (Sat, 01 Dec 2007) | 2 lines Add a few refcount data entries. ........ r59264 | georg.brandl | 2007-12-01 23:38:48 +0100 (Sat, 01 Dec 2007) | 4 lines Add test suite for cmd module. Written by Michael Schneider for GHOP. ........ r59265 | georg.brandl | 2007-12-01 23:42:46 +0100 (Sat, 01 Dec 2007) | 3 lines Add examples to the ElementTree documentation. Written by h4wk.cz for GHOP. ........ r59266 | georg.brandl | 2007-12-02 00:12:45 +0100 (Sun, 02 Dec 2007) | 3 lines Add "Using Python on Windows" document, by Robert Lehmann. Written for GHOP. ........ r59271 | georg.brandl | 2007-12-02 15:34:34 +0100 (Sun, 02 Dec 2007) | 3 lines Add example to mmap docs. Written for GHOP by Rafal Rawicki. ........ r59272 | georg.brandl | 2007-12-02 15:37:29 +0100 (Sun, 02 Dec 2007) | 2 lines Convert bdb.rst line endings to Unix style. ........ r59274 | georg.brandl | 2007-12-02 15:58:50 +0100 (Sun, 02 Dec 2007) | 4 lines Add more entries to the glossary. Written by Jeff Wheeler for GHOP. ........
19 years ago
#1370: Finish the merge r58749, log below, by resolving all conflicts in Doc/. Merged revisions 58221-58741 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r58221 | georg.brandl | 2007-09-20 10:57:59 -0700 (Thu, 20 Sep 2007) | 2 lines Patch #1181: add os.environ.clear() method. ........ r58225 | sean.reifschneider | 2007-09-20 23:33:28 -0700 (Thu, 20 Sep 2007) | 3 lines Issue1704287: "make install" fails unless you do "make" first. Make oldsharedmods and sharedmods in "libinstall". ........ r58232 | guido.van.rossum | 2007-09-22 13:18:03 -0700 (Sat, 22 Sep 2007) | 4 lines Patch # 188 by Philip Jenvey. Make tell() mark CRLF as a newline. With unit test. ........ r58242 | georg.brandl | 2007-09-24 10:55:47 -0700 (Mon, 24 Sep 2007) | 2 lines Fix typo and double word. ........ r58245 | georg.brandl | 2007-09-24 10:59:28 -0700 (Mon, 24 Sep 2007) | 2 lines #1196: document default radix for int(). ........ r58247 | georg.brandl | 2007-09-24 11:08:24 -0700 (Mon, 24 Sep 2007) | 2 lines #1177: accept 2xx responses for https too, not only http. ........ r58249 | andrew.kuchling | 2007-09-24 16:45:51 -0700 (Mon, 24 Sep 2007) | 1 line Remove stray odd character; grammar fix ........ r58250 | andrew.kuchling | 2007-09-24 16:46:28 -0700 (Mon, 24 Sep 2007) | 1 line Typo fix ........ r58251 | andrew.kuchling | 2007-09-24 17:09:42 -0700 (Mon, 24 Sep 2007) | 1 line Add various items ........ r58268 | vinay.sajip | 2007-09-26 22:34:45 -0700 (Wed, 26 Sep 2007) | 1 line Change to flush and close logic to fix #1760556. ........ r58269 | vinay.sajip | 2007-09-26 22:38:51 -0700 (Wed, 26 Sep 2007) | 1 line Change to basicConfig() to fix #1021. ........ r58270 | georg.brandl | 2007-09-26 23:26:58 -0700 (Wed, 26 Sep 2007) | 2 lines #1208: document match object's boolean value. ........ r58271 | vinay.sajip | 2007-09-26 23:56:13 -0700 (Wed, 26 Sep 2007) | 1 line Minor date change. ........ r58272 | vinay.sajip | 2007-09-27 00:35:10 -0700 (Thu, 27 Sep 2007) | 1 line Change to LogRecord.__init__() to fix #1206. Note that archaic use of type(x) == types.DictType is because of keeping 1.5.2 compatibility. While this is much less relevant these days, there probably needs to be a separate commit for removing all archaic constructs at the same time. ........ r58288 | brett.cannon | 2007-09-30 12:45:10 -0700 (Sun, 30 Sep 2007) | 9 lines tuple.__repr__ did not consider a reference loop as it is not possible from Python code; but it is possible from C. object.__str__ had the issue of not expecting a type to doing something within it's tp_str implementation that could trigger an infinite recursion, but it could in C code.. Both found thanks to BaseException and how it handles its repr. Closes issue #1686386. Thanks to Thomas Herve for taking an initial stab at coming up with a solution. ........ r58289 | brett.cannon | 2007-09-30 13:37:19 -0700 (Sun, 30 Sep 2007) | 3 lines Fix error introduced by r58288; if a tuple is length 0 return its repr and don't worry about any self-referring tuples. ........ r58294 | facundo.batista | 2007-10-02 10:01:24 -0700 (Tue, 02 Oct 2007) | 11 lines Made the various is_* operations return booleans. This was discussed with Cawlishaw by mail, and he basically confirmed that to these is_* operations, there's no need to return Decimal(0) and Decimal(1) if the language supports the False and True booleans. Also added a few tests for the these functions in extra.decTest, since they are mostly untested (apart from the doctests). Thanks Mark Dickinson ........ r58295 | facundo.batista | 2007-10-02 11:21:18 -0700 (Tue, 02 Oct 2007) | 4 lines Added a class to store the digits of log(10), so that they can be made available when necessary without recomputing. Thanks Mark Dickinson ........ r58299 | mark.summerfield | 2007-10-03 01:53:21 -0700 (Wed, 03 Oct 2007) | 4 lines Added note in footnote about string comparisons about unicodedata.normalize(). ........ r58304 | raymond.hettinger | 2007-10-03 14:18:11 -0700 (Wed, 03 Oct 2007) | 1 line enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy. ........ r58305 | raymond.hettinger | 2007-10-03 17:20:27 -0700 (Wed, 03 Oct 2007) | 1 line itertools.count() no longer limited to sys.maxint. ........ r58306 | kurt.kaiser | 2007-10-03 18:49:54 -0700 (Wed, 03 Oct 2007) | 3 lines Assume that the user knows when he wants to end the line; don't insert something he didn't select or complete. ........ r58307 | kurt.kaiser | 2007-10-03 19:07:50 -0700 (Wed, 03 Oct 2007) | 2 lines Remove unused theme that was causing a fault in p3k. ........ r58308 | kurt.kaiser | 2007-10-03 19:09:17 -0700 (Wed, 03 Oct 2007) | 2 lines Clean up EditorWindow close. ........ r58309 | kurt.kaiser | 2007-10-03 19:53:07 -0700 (Wed, 03 Oct 2007) | 7 lines textView cleanup. Patch 1718043 Tal Einat. M idlelib/EditorWindow.py M idlelib/aboutDialog.py M idlelib/textView.py M idlelib/NEWS.txt ........ r58310 | kurt.kaiser | 2007-10-03 20:11:12 -0700 (Wed, 03 Oct 2007) | 3 lines configDialog cleanup. Patch 1730217 Tal Einat. ........ r58311 | neal.norwitz | 2007-10-03 23:00:48 -0700 (Wed, 03 Oct 2007) | 4 lines Coverity #151: Remove deadcode. All this code already exists above starting at line 653. ........ r58325 | fred.drake | 2007-10-04 19:46:12 -0700 (Thu, 04 Oct 2007) | 1 line wrap lines to <80 characters before fixing errors ........ r58326 | raymond.hettinger | 2007-10-04 19:47:07 -0700 (Thu, 04 Oct 2007) | 6 lines Add __asdict__() to NamedTuple and refine the docs. Add maxlen support to deque() and fixup docs. Partially fix __reduce__(). The None as a third arg was no longer supported. Still needs work on __reduce__() to handle recursive inputs. ........ r58327 | fred.drake | 2007-10-04 19:48:32 -0700 (Thu, 04 Oct 2007) | 3 lines move descriptions of ac_(in|out)_buffer_size to the right place http://bugs.python.org/issue1053 ........ r58329 | neal.norwitz | 2007-10-04 20:39:17 -0700 (Thu, 04 Oct 2007) | 3 lines dict could be NULL, so we need to XDECREF. Fix a compiler warning about passing a PyTypeObject* instead of PyObject*. ........ r58330 | neal.norwitz | 2007-10-04 20:41:19 -0700 (Thu, 04 Oct 2007) | 2 lines Fix Coverity #158: Check the correct variable. ........ r58332 | neal.norwitz | 2007-10-04 22:01:38 -0700 (Thu, 04 Oct 2007) | 7 lines Fix Coverity #159. This code was broken if save() returned a negative number since i contained a boolean value and then we compared i < 0 which should never be true. Will backport (assuming it's necessary) ........ r58334 | neal.norwitz | 2007-10-04 22:29:17 -0700 (Thu, 04 Oct 2007) | 1 line Add a note about fixing some more warnings found by Coverity. ........ r58338 | raymond.hettinger | 2007-10-05 12:07:31 -0700 (Fri, 05 Oct 2007) | 1 line Restore BEGIN/END THREADS macros which were squashed in the previous checkin ........ r58343 | gregory.p.smith | 2007-10-06 00:48:10 -0700 (Sat, 06 Oct 2007) | 3 lines Stab in the dark attempt to fix the test_bsddb3 failure on sparc and S-390 ubuntu buildbots. ........ r58344 | gregory.p.smith | 2007-10-06 00:51:59 -0700 (Sat, 06 Oct 2007) | 2 lines Allows BerkeleyDB 4.6.x >= 4.6.21 for the bsddb module. ........ r58348 | gregory.p.smith | 2007-10-06 08:47:37 -0700 (Sat, 06 Oct 2007) | 3 lines Use the host the author likely meant in the first place. pop.gmail.com is reliable. gmail.org is someones personal domain. ........ r58351 | neal.norwitz | 2007-10-06 12:16:28 -0700 (Sat, 06 Oct 2007) | 3 lines Ensure that this test will pass even if another test left an unwritable TESTFN. Also use the safe unlink in test_support instead of rolling our own here. ........ r58368 | georg.brandl | 2007-10-08 00:50:24 -0700 (Mon, 08 Oct 2007) | 3 lines #1123: fix the docs for the str.split(None, sep) case. Also expand a few other methods' docs, which had more info in the deprecated string module docs. ........ r58369 | georg.brandl | 2007-10-08 01:06:05 -0700 (Mon, 08 Oct 2007) | 2 lines Update docstring of sched, also remove an unused assignment. ........ r58370 | raymond.hettinger | 2007-10-08 02:14:28 -0700 (Mon, 08 Oct 2007) | 5 lines Add comments to NamedTuple code. Let the field spec be either a string or a non-string sequence (suggested by Martin Blais with use cases). Improve the error message in the case of a SyntaxError (caused by a duplicate field name). ........ r58371 | raymond.hettinger | 2007-10-08 02:56:29 -0700 (Mon, 08 Oct 2007) | 1 line Missed a line in the docs ........ r58372 | raymond.hettinger | 2007-10-08 03:11:51 -0700 (Mon, 08 Oct 2007) | 1 line Better variable names ........ r58376 | georg.brandl | 2007-10-08 07:12:47 -0700 (Mon, 08 Oct 2007) | 3 lines #1199: docs for tp_as_{number,sequence,mapping}, by Amaury Forgeot d'Arc. No need to merge this to py3k! ........ r58380 | raymond.hettinger | 2007-10-08 14:26:58 -0700 (Mon, 08 Oct 2007) | 1 line Eliminate camelcase function name ........ r58381 | andrew.kuchling | 2007-10-08 16:23:03 -0700 (Mon, 08 Oct 2007) | 1 line Eliminate camelcase function name ........ r58382 | raymond.hettinger | 2007-10-08 18:36:23 -0700 (Mon, 08 Oct 2007) | 1 line Make the error messages more specific ........ r58384 | gregory.p.smith | 2007-10-08 23:02:21 -0700 (Mon, 08 Oct 2007) | 10 lines Splits Modules/_bsddb.c up into bsddb.h and _bsddb.c and adds a C API object available as bsddb.db.api. This is based on the patch submitted by Duncan Grisby here: http://sourceforge.net/tracker/index.php?func=detail&aid=1551895&group_id=13900&atid=313900 See this thread for additional info: http://sourceforge.net/mailarchive/forum.php?thread_name=E1GAVDK-0002rk-Iw%40apasphere.com&forum_name=pybsddb-users It also cleans up the code a little by removing some ifdef/endifs for python prior to 2.1 and for unsupported Berkeley DB <= 3.2. ........ r58385 | gregory.p.smith | 2007-10-08 23:50:43 -0700 (Mon, 08 Oct 2007) | 5 lines Fix a double free when positioning a database cursor to a non-existant string key (and probably a few other situations with string keys). This was reported with a patch as pybsddb sourceforge bug 1708868 by jjjhhhlll at gmail. ........ r58386 | gregory.p.smith | 2007-10-09 00:19:11 -0700 (Tue, 09 Oct 2007) | 3 lines Use the highest cPickle protocol in bsddb.dbshelve. This comes from sourceforge pybsddb patch 1551443 by w_barnes. ........ r58394 | gregory.p.smith | 2007-10-09 11:26:02 -0700 (Tue, 09 Oct 2007) | 2 lines remove another sleepycat reference ........ r58396 | kurt.kaiser | 2007-10-09 12:31:30 -0700 (Tue, 09 Oct 2007) | 3 lines Allow interrupt only when executing user code in subprocess Patch 1225 Tal Einat modified from IDLE-Spoon. ........ r58399 | brett.cannon | 2007-10-09 17:07:50 -0700 (Tue, 09 Oct 2007) | 5 lines Remove file-level typedefs that were inconsistently used throughout the file. Just move over to the public API names. Closes issue1238. ........ r58401 | raymond.hettinger | 2007-10-09 17:26:46 -0700 (Tue, 09 Oct 2007) | 1 line Accept Jim Jewett's api suggestion to use None instead of -1 to indicate unbounded deques. ........ r58403 | kurt.kaiser | 2007-10-09 17:55:40 -0700 (Tue, 09 Oct 2007) | 2 lines Allow cursor color change w/o restart. Patch 1725576 Tal Einat. ........ r58404 | kurt.kaiser | 2007-10-09 18:06:47 -0700 (Tue, 09 Oct 2007) | 2 lines show paste if > 80 columns. Patch 1659326 Tal Einat. ........ r58415 | thomas.heller | 2007-10-11 12:51:32 -0700 (Thu, 11 Oct 2007) | 5 lines On OS X, use os.uname() instead of gestalt.sysv(...) to get the operating system version. This allows to use ctypes when Python was configured with --disable-toolbox-glue. ........ r58419 | neal.norwitz | 2007-10-11 20:01:01 -0700 (Thu, 11 Oct 2007) | 1 line Get rid of warning about not being able to create an existing directory. ........ r58420 | neal.norwitz | 2007-10-11 20:01:30 -0700 (Thu, 11 Oct 2007) | 1 line Get rid of warnings on a bunch of platforms by using a proper prototype. ........ r58421 | neal.norwitz | 2007-10-11 20:01:54 -0700 (Thu, 11 Oct 2007) | 4 lines Get rid of compiler warning about retval being used (returned) without being initialized. (gcc warning and Coverity 202) ........ r58422 | neal.norwitz | 2007-10-11 20:03:23 -0700 (Thu, 11 Oct 2007) | 1 line Fix Coverity 168: Close the file before returning (exiting). ........ r58423 | neal.norwitz | 2007-10-11 20:04:18 -0700 (Thu, 11 Oct 2007) | 4 lines Fix Coverity 180: Don't overallocate. We don't need structs, but pointers. Also fix a memory leak. ........ r58424 | neal.norwitz | 2007-10-11 20:05:19 -0700 (Thu, 11 Oct 2007) | 5 lines Fix Coverity 185-186: If the passed in FILE is NULL, uninitialized memory would be accessed. Will backport. ........ r58425 | neal.norwitz | 2007-10-11 20:52:34 -0700 (Thu, 11 Oct 2007) | 1 line Get this module to compile with bsddb versions prior to 4.3 ........ r58430 | martin.v.loewis | 2007-10-12 01:56:52 -0700 (Fri, 12 Oct 2007) | 3 lines Bug #1216: Restore support for Visual Studio 2002. Will backport to 2.5. ........ r58433 | raymond.hettinger | 2007-10-12 10:53:11 -0700 (Fri, 12 Oct 2007) | 1 line Fix test of count.__repr__() to ignore the 'L' if the count is a long ........ r58434 | gregory.p.smith | 2007-10-12 11:44:06 -0700 (Fri, 12 Oct 2007) | 4 lines Fixes http://bugs.python.org/issue1233 - bsddb.dbshelve.DBShelf.append was useless due to inverted logic. Also adds a test case for RECNO dbs to test_dbshelve. ........ r58445 | georg.brandl | 2007-10-13 06:20:03 -0700 (Sat, 13 Oct 2007) | 2 lines Fix email example. ........ r58450 | gregory.p.smith | 2007-10-13 16:02:05 -0700 (Sat, 13 Oct 2007) | 2 lines Fix an uncollectable reference leak in bsddb.db.DBShelf.append ........ r58453 | neal.norwitz | 2007-10-13 17:18:40 -0700 (Sat, 13 Oct 2007) | 8 lines Let the O/S supply a port if none of the default ports can be used. This should make the tests more robust at the expense of allowing tests to be sloppier by not requiring them to cleanup after themselves. (It will legitamitely help when running two test suites simultaneously or if another process is already using one of the predefined ports.) Also simplifies (slightLy) the exception handling elsewhere. ........ r58459 | neal.norwitz | 2007-10-14 11:30:21 -0700 (Sun, 14 Oct 2007) | 2 lines Don't raise a string exception, they don't work anymore. ........ r58460 | neal.norwitz | 2007-10-14 11:40:37 -0700 (Sun, 14 Oct 2007) | 1 line Use unittest for assertions ........ r58468 | armin.rigo | 2007-10-15 00:48:35 -0700 (Mon, 15 Oct 2007) | 2 lines test_bigbits was not testing what it seemed to. ........ r58471 | guido.van.rossum | 2007-10-15 08:54:11 -0700 (Mon, 15 Oct 2007) | 3 lines Change a PyErr_Print() into a PyErr_Clear(), per discussion in issue 1031213. ........ r58500 | raymond.hettinger | 2007-10-16 12:18:30 -0700 (Tue, 16 Oct 2007) | 1 line Improve error messages ........ r58506 | raymond.hettinger | 2007-10-16 14:28:32 -0700 (Tue, 16 Oct 2007) | 1 line More docs, error messages, and tests ........ r58507 | andrew.kuchling | 2007-10-16 15:58:03 -0700 (Tue, 16 Oct 2007) | 1 line Add items ........ r58508 | brett.cannon | 2007-10-16 16:24:06 -0700 (Tue, 16 Oct 2007) | 3 lines Remove ``:const:`` notation on None in parameter list. Since the markup is not rendered for parameters it just showed up as ``:const:`None` `` in the output. ........ r58509 | brett.cannon | 2007-10-16 16:26:45 -0700 (Tue, 16 Oct 2007) | 3 lines Re-order some functions whose parameters differ between PyObject and const char * so that they are next to each other. ........ r58522 | armin.rigo | 2007-10-17 11:46:37 -0700 (Wed, 17 Oct 2007) | 5 lines Fix the overflow checking of list_repeat. Introduce overflow checking into list_inplace_repeat. Backport candidate, possibly. ........ r58530 | facundo.batista | 2007-10-17 20:16:03 -0700 (Wed, 17 Oct 2007) | 7 lines Issue #1580738. When HTTPConnection reads the whole stream with read(), it closes itself. When the stream is read in several calls to read(n), it should behave in the same way if HTTPConnection knows where the end of the stream is (through self.length). Added a test case for this behaviour. ........ r58531 | facundo.batista | 2007-10-17 20:44:48 -0700 (Wed, 17 Oct 2007) | 3 lines Issue 1289, just a typo. ........ r58532 | gregory.p.smith | 2007-10-18 00:56:54 -0700 (Thu, 18 Oct 2007) | 4 lines cleanup test_dbtables to use mkdtemp. cleanup dbtables to pass txn as a keyword argument whenever possible to avoid bugs and confusion. (dbtables.py line 447 self.db.get using txn as a non-keyword was an actual bug due to this) ........ r58533 | gregory.p.smith | 2007-10-18 01:34:20 -0700 (Thu, 18 Oct 2007) | 4 lines Fix a weird bug in dbtables: if it chose a random rowid string that contained NULL bytes it would cause the database all sorts of problems in the future leading to very strange random failures and corrupt dbtables.bsdTableDb dbs. ........ r58534 | gregory.p.smith | 2007-10-18 09:32:02 -0700 (Thu, 18 Oct 2007) | 3 lines A cleaner fix than the one committed last night. Generate random rowids that do not contain null bytes. ........ r58537 | gregory.p.smith | 2007-10-18 10:17:57 -0700 (Thu, 18 Oct 2007) | 2 lines mention bsddb fixes. ........ r58538 | raymond.hettinger | 2007-10-18 14:13:06 -0700 (Thu, 18 Oct 2007) | 1 line Remove useless warning ........ r58539 | gregory.p.smith | 2007-10-19 00:31:20 -0700 (Fri, 19 Oct 2007) | 2 lines squelch the warning that this test is supposed to trigger. ........ r58542 | georg.brandl | 2007-10-19 05:32:39 -0700 (Fri, 19 Oct 2007) | 2 lines Clarify wording for apply(). ........ r58544 | mark.summerfield | 2007-10-19 05:48:17 -0700 (Fri, 19 Oct 2007) | 3 lines Added a cross-ref to each other. ........ r58545 | georg.brandl | 2007-10-19 10:38:49 -0700 (Fri, 19 Oct 2007) | 2 lines #1284: "S" means "seen", not unread. ........ r58548 | thomas.heller | 2007-10-19 11:11:41 -0700 (Fri, 19 Oct 2007) | 4 lines Fix ctypes on 32-bit systems when Python is configured --with-system-ffi. See also https://bugs.launchpad.net/bugs/72505. Ported from release25-maint branch. ........ r58550 | facundo.batista | 2007-10-19 12:25:57 -0700 (Fri, 19 Oct 2007) | 8 lines The constructor from tuple was way too permissive: it allowed bad coefficient numbers, floats in the sign, and other details that generated directly the wrong number in the best case, or triggered misfunctionality in the alorithms. Test cases added for these issues. Thanks Mark Dickinson. ........ r58559 | georg.brandl | 2007-10-20 06:22:53 -0700 (Sat, 20 Oct 2007) | 2 lines Fix code being interpreted as a target. ........ r58561 | georg.brandl | 2007-10-20 06:36:24 -0700 (Sat, 20 Oct 2007) | 2 lines Document new "cmdoption" directive. ........ r58562 | georg.brandl | 2007-10-20 08:21:22 -0700 (Sat, 20 Oct 2007) | 2 lines Make a path more Unix-standardy. ........ r58564 | georg.brandl | 2007-10-20 10:51:39 -0700 (Sat, 20 Oct 2007) | 2 lines Document new directive "envvar". ........ r58567 | georg.brandl | 2007-10-20 11:08:14 -0700 (Sat, 20 Oct 2007) | 6 lines * Add new toplevel chapter, "Using Python." (how to install, configure and setup python on different platforms -- at least in theory.) * Move the Python on Mac docs in that chapter. * Add a new chapter about the command line invocation, by stargaming. ........ r58568 | georg.brandl | 2007-10-20 11:33:20 -0700 (Sat, 20 Oct 2007) | 2 lines Change title, for now. ........ r58569 | georg.brandl | 2007-10-20 11:39:25 -0700 (Sat, 20 Oct 2007) | 2 lines Add entry to ACKS. ........ r58570 | georg.brandl | 2007-10-20 12:05:45 -0700 (Sat, 20 Oct 2007) | 2 lines Clarify -E docs. ........ r58571 | georg.brandl | 2007-10-20 12:08:36 -0700 (Sat, 20 Oct 2007) | 2 lines Even more clarification. ........ r58572 | andrew.kuchling | 2007-10-20 12:25:37 -0700 (Sat, 20 Oct 2007) | 1 line Fix protocol name ........ r58573 | andrew.kuchling | 2007-10-20 12:35:18 -0700 (Sat, 20 Oct 2007) | 1 line Various items ........ r58574 | andrew.kuchling | 2007-10-20 12:39:35 -0700 (Sat, 20 Oct 2007) | 1 line Use correct header line ........ r58576 | armin.rigo | 2007-10-21 02:14:15 -0700 (Sun, 21 Oct 2007) | 3 lines Add a crasher for the long-standing issue with closing a file while another thread uses it. ........ r58577 | georg.brandl | 2007-10-21 03:01:56 -0700 (Sun, 21 Oct 2007) | 2 lines Remove duplicate crasher. ........ r58578 | georg.brandl | 2007-10-21 03:24:20 -0700 (Sun, 21 Oct 2007) | 2 lines Unify "byte code" to "bytecode". Also sprinkle :term: markup for it. ........ r58579 | georg.brandl | 2007-10-21 03:32:54 -0700 (Sun, 21 Oct 2007) | 2 lines Add markup to new function descriptions. ........ r58580 | georg.brandl | 2007-10-21 03:45:46 -0700 (Sun, 21 Oct 2007) | 2 lines Add :term:s for descriptors. ........ r58581 | georg.brandl | 2007-10-21 03:46:24 -0700 (Sun, 21 Oct 2007) | 2 lines Unify "file-descriptor" to "file descriptor". ........ r58582 | georg.brandl | 2007-10-21 03:52:38 -0700 (Sun, 21 Oct 2007) | 2 lines Add :term: for generators. ........ r58583 | georg.brandl | 2007-10-21 05:10:28 -0700 (Sun, 21 Oct 2007) | 2 lines Add :term:s for iterator. ........ r58584 | georg.brandl | 2007-10-21 05:15:05 -0700 (Sun, 21 Oct 2007) | 2 lines Add :term:s for "new-style class". ........ r58588 | neal.norwitz | 2007-10-21 21:47:54 -0700 (Sun, 21 Oct 2007) | 1 line Add Chris Monson so he can edit PEPs. ........ r58594 | guido.van.rossum | 2007-10-22 09:27:19 -0700 (Mon, 22 Oct 2007) | 4 lines Issue #1307, patch by Derek Shockey. When "MAIL" is received without args, an exception happens instead of sending a 501 syntax error response. ........ r58598 | travis.oliphant | 2007-10-22 19:40:56 -0700 (Mon, 22 Oct 2007) | 1 line Add phuang patch from Issue 708374 which adds offset parameter to mmap module. ........ r58601 | neal.norwitz | 2007-10-22 22:44:27 -0700 (Mon, 22 Oct 2007) | 2 lines Bug #1313, fix typo (wrong variable name) in example. ........ r58609 | georg.brandl | 2007-10-23 11:21:35 -0700 (Tue, 23 Oct 2007) | 2 lines Update Pygments version from externals. ........ r58618 | guido.van.rossum | 2007-10-23 12:25:41 -0700 (Tue, 23 Oct 2007) | 3 lines Issue 1307 by Derek Shockey, fox the same bug for RCPT. Neal: please backport! ........ r58620 | raymond.hettinger | 2007-10-23 13:37:41 -0700 (Tue, 23 Oct 2007) | 1 line Shorter name for namedtuple() ........ r58621 | andrew.kuchling | 2007-10-23 13:55:47 -0700 (Tue, 23 Oct 2007) | 1 line Update name ........ r58622 | raymond.hettinger | 2007-10-23 14:23:07 -0700 (Tue, 23 Oct 2007) | 1 line Fixup news entry ........ r58623 | raymond.hettinger | 2007-10-23 18:28:33 -0700 (Tue, 23 Oct 2007) | 1 line Optimize sum() for integer and float inputs. ........ r58624 | raymond.hettinger | 2007-10-23 19:05:51 -0700 (Tue, 23 Oct 2007) | 1 line Fixup error return and add support for intermixed ints and floats/ ........ r58628 | vinay.sajip | 2007-10-24 03:47:06 -0700 (Wed, 24 Oct 2007) | 1 line Bug #1321: Fixed logic error in TimedRotatingFileHandler.__init__() ........ r58641 | facundo.batista | 2007-10-24 12:11:08 -0700 (Wed, 24 Oct 2007) | 4 lines Issue 1290. CharacterData.__repr__ was constructing a string in response that keeped having a non-ascii character. ........ r58643 | thomas.heller | 2007-10-24 12:50:45 -0700 (Wed, 24 Oct 2007) | 1 line Added unittest for calling a function with paramflags (backport from py3k branch). ........ r58645 | matthias.klose | 2007-10-24 13:00:44 -0700 (Wed, 24 Oct 2007) | 2 lines - Build using system ffi library on arm*-linux*. ........ r58651 | georg.brandl | 2007-10-24 14:40:38 -0700 (Wed, 24 Oct 2007) | 2 lines Bug #1287: make os.environ.pop() work as expected. ........ r58652 | raymond.hettinger | 2007-10-24 19:26:58 -0700 (Wed, 24 Oct 2007) | 1 line Missing DECREFs ........ r58653 | matthias.klose | 2007-10-24 23:37:24 -0700 (Wed, 24 Oct 2007) | 2 lines - Build using system ffi library on arm*-linux*, pass --with-system-ffi to CONFIG_ARGS ........ r58655 | thomas.heller | 2007-10-25 12:47:32 -0700 (Thu, 25 Oct 2007) | 2 lines ffi_type_longdouble may be already #defined. See issue 1324. ........ r58656 | kurt.kaiser | 2007-10-25 15:43:45 -0700 (Thu, 25 Oct 2007) | 3 lines Correct an ancient bug in an unused path by removing that path: register() is now idempotent. ........ r58660 | kurt.kaiser | 2007-10-25 17:10:09 -0700 (Thu, 25 Oct 2007) | 4 lines 1. Add comments to provide top-level documentation. 2. Refactor to use more descriptive names. 3. Enhance tests in main(). ........ r58675 | georg.brandl | 2007-10-26 11:30:41 -0700 (Fri, 26 Oct 2007) | 2 lines Fix new pop() method on os.environ on ignorecase-platforms. ........ r58696 | neal.norwitz | 2007-10-27 15:32:21 -0700 (Sat, 27 Oct 2007) | 1 line Update URL for Pygments. 0.8.1 is no longer available ........ r58697 | hyeshik.chang | 2007-10-28 04:19:02 -0700 (Sun, 28 Oct 2007) | 3 lines - Add support for FreeBSD 8 which is recently forked from FreeBSD 7. - Regenerate IN module for most recent maintenance tree of FreeBSD 6 and 7. ........ r58698 | hyeshik.chang | 2007-10-28 05:38:09 -0700 (Sun, 28 Oct 2007) | 2 lines Enable platform-specific tweaks for FreeBSD 8 (exactly same to FreeBSD 7's yet) ........ r58700 | kurt.kaiser | 2007-10-28 12:03:59 -0700 (Sun, 28 Oct 2007) | 2 lines Add confirmation dialog before printing. Patch 1717170 Tal Einat. ........ r58706 | guido.van.rossum | 2007-10-29 13:52:45 -0700 (Mon, 29 Oct 2007) | 3 lines Patch 1353 by Jacob Winther. Add mp4 mapping to mimetypes.py. ........ r58709 | guido.van.rossum | 2007-10-29 15:15:05 -0700 (Mon, 29 Oct 2007) | 6 lines Backport fixes for the code that decodes octal escapes (and for PyString also hex escapes) -- this was reaching beyond the end of the input string buffer, even though it is not supposed to be \0-terminated. This has no visible effect but is clearly the correct thing to do. (In 3.0 it had a visible effect after removing ob_sstate from PyString.) ........ r58710 | kurt.kaiser | 2007-10-29 19:38:54 -0700 (Mon, 29 Oct 2007) | 7 lines check in Tal Einat's update to tabpage.py Patch 1612746 M configDialog.py M NEWS.txt AM tabbedpages.py ........ r58715 | georg.brandl | 2007-10-30 10:51:18 -0700 (Tue, 30 Oct 2007) | 2 lines Use correct markup. ........ r58716 | georg.brandl | 2007-10-30 10:57:12 -0700 (Tue, 30 Oct 2007) | 2 lines Make example about hiding None return values at the prompt clearer. ........ r58728 | neal.norwitz | 2007-10-30 23:33:20 -0700 (Tue, 30 Oct 2007) | 1 line Fix some compiler warnings for signed comparisons on Unix and Windows. ........ r58731 | martin.v.loewis | 2007-10-31 10:19:33 -0700 (Wed, 31 Oct 2007) | 2 lines Adding Christian Heimes. ........ r58737 | raymond.hettinger | 2007-10-31 14:57:58 -0700 (Wed, 31 Oct 2007) | 1 line Clarify the reasons why pickle is almost always better than marshal ........ r58739 | raymond.hettinger | 2007-10-31 15:15:49 -0700 (Wed, 31 Oct 2007) | 1 line Sets are marshalable. ........
19 years ago
14 years ago
  1. :mod:`contextlib` --- Utilities for :keyword:`with`\ -statement contexts
  2. ========================================================================
  3. .. module:: contextlib
  4. :synopsis: Utilities for with-statement contexts.
  5. **Source code:** :source:`Lib/contextlib.py`
  6. --------------
  7. This module provides utilities for common tasks involving the :keyword:`with`
  8. statement. For more information see also :ref:`typecontextmanager` and
  9. :ref:`context-managers`.
  10. Utilities
  11. ---------
  12. Functions and classes provided:
  13. .. decorator:: contextmanager
  14. This function is a :term:`decorator` that can be used to define a factory
  15. function for :keyword:`with` statement context managers, without needing to
  16. create a class or separate :meth:`__enter__` and :meth:`__exit__` methods.
  17. A simple example (this is not recommended as a real way of generating HTML!)::
  18. from contextlib import contextmanager
  19. @contextmanager
  20. def tag(name):
  21. print("<%s>" % name)
  22. yield
  23. print("</%s>" % name)
  24. >>> with tag("h1"):
  25. ... print("foo")
  26. ...
  27. <h1>
  28. foo
  29. </h1>
  30. The function being decorated must return a :term:`generator`-iterator when
  31. called. This iterator must yield exactly one value, which will be bound to
  32. the targets in the :keyword:`with` statement's :keyword:`as` clause, if any.
  33. At the point where the generator yields, the block nested in the :keyword:`with`
  34. statement is executed. The generator is then resumed after the block is exited.
  35. If an unhandled exception occurs in the block, it is reraised inside the
  36. generator at the point where the yield occurred. Thus, you can use a
  37. :keyword:`try`...\ :keyword:`except`...\ :keyword:`finally` statement to trap
  38. the error (if any), or ensure that some cleanup takes place. If an exception is
  39. trapped merely in order to log it or to perform some action (rather than to
  40. suppress it entirely), the generator must reraise that exception. Otherwise the
  41. generator context manager will indicate to the :keyword:`with` statement that
  42. the exception has been handled, and execution will resume with the statement
  43. immediately following the :keyword:`with` statement.
  44. :func:`contextmanager` uses :class:`ContextDecorator` so the context managers
  45. it creates can be used as decorators as well as in :keyword:`with` statements.
  46. When used as a decorator, a new generator instance is implicitly created on
  47. each function call (this allows the otherwise "one-shot" context managers
  48. created by :func:`contextmanager` to meet the requirement that context
  49. managers support multiple invocations in order to be used as decorators).
  50. .. versionchanged:: 3.2
  51. Use of :class:`ContextDecorator`.
  52. .. function:: closing(thing)
  53. Return a context manager that closes *thing* upon completion of the block. This
  54. is basically equivalent to::
  55. from contextlib import contextmanager
  56. @contextmanager
  57. def closing(thing):
  58. try:
  59. yield thing
  60. finally:
  61. thing.close()
  62. And lets you write code like this::
  63. from contextlib import closing
  64. from urllib.request import urlopen
  65. with closing(urlopen('http://www.python.org')) as page:
  66. for line in page:
  67. print(line)
  68. without needing to explicitly close ``page``. Even if an error occurs,
  69. ``page.close()`` will be called when the :keyword:`with` block is exited.
  70. .. function:: suppress(*exceptions)
  71. Return a context manager that suppresses any of the specified exceptions
  72. if they occur in the body of a with statement and then resumes execution
  73. with the first statement following the end of the with statement.
  74. As with any other mechanism that completely suppresses exceptions, this
  75. context manager should be used only to cover very specific errors where
  76. silently continuing with program execution is known to be the right
  77. thing to do.
  78. For example::
  79. from contextlib import suppress
  80. with suppress(FileNotFoundError):
  81. os.remove('somefile.tmp')
  82. with suppress(FileNotFoundError):
  83. os.remove('someotherfile.tmp')
  84. This code is equivalent to::
  85. try:
  86. os.remove('somefile.tmp')
  87. except FileNotFoundError:
  88. pass
  89. try:
  90. os.remove('someotherfile.tmp')
  91. except FileNotFoundError:
  92. pass
  93. This context manager is :ref:`reentrant <reentrant-cms>`.
  94. .. versionadded:: 3.4
  95. .. function:: redirect_stdout(new_target)
  96. Context manager for temporarily redirecting :data:`sys.stdout` to
  97. another file or file-like object.
  98. This tool adds flexibility to existing functions or classes whose output
  99. is hardwired to stdout.
  100. For example, the output of :func:`help` normally is sent to *sys.stdout*.
  101. You can capture that output in a string by redirecting the output to an
  102. :class:`io.StringIO` object::
  103. f = io.StringIO()
  104. with redirect_stdout(f):
  105. help(pow)
  106. s = f.getvalue()
  107. To send the output of :func:`help` to a file on disk, redirect the output
  108. to a regular file::
  109. with open('help.txt', 'w') as f:
  110. with redirect_stdout(f):
  111. help(pow)
  112. To send the output of :func:`help` to *sys.stderr*::
  113. with redirect_stdout(sys.stderr):
  114. help(pow)
  115. Note that the global side effect on :data:`sys.stdout` means that this
  116. context manager is not suitable for use in library code and most threaded
  117. applications. It also has no effect on the output of subprocesses.
  118. However, it is still a useful approach for many utility scripts.
  119. This context manager is :ref:`reentrant <reentrant-cms>`.
  120. .. versionadded:: 3.4
  121. .. function:: redirect_stderr(new_target)
  122. Similar to :func:`~contextlib.redirect_stdout` but redirecting
  123. :data:`sys.stderr` to another file or file-like object.
  124. This context manager is :ref:`reentrant <reentrant-cms>`.
  125. .. versionadded:: 3.5
  126. .. class:: ContextDecorator()
  127. A base class that enables a context manager to also be used as a decorator.
  128. Context managers inheriting from ``ContextDecorator`` have to implement
  129. ``__enter__`` and ``__exit__`` as normal. ``__exit__`` retains its optional
  130. exception handling even when used as a decorator.
  131. ``ContextDecorator`` is used by :func:`contextmanager`, so you get this
  132. functionality automatically.
  133. Example of ``ContextDecorator``::
  134. from contextlib import ContextDecorator
  135. class mycontext(ContextDecorator):
  136. def __enter__(self):
  137. print('Starting')
  138. return self
  139. def __exit__(self, *exc):
  140. print('Finishing')
  141. return False
  142. >>> @mycontext()
  143. ... def function():
  144. ... print('The bit in the middle')
  145. ...
  146. >>> function()
  147. Starting
  148. The bit in the middle
  149. Finishing
  150. >>> with mycontext():
  151. ... print('The bit in the middle')
  152. ...
  153. Starting
  154. The bit in the middle
  155. Finishing
  156. This change is just syntactic sugar for any construct of the following form::
  157. def f():
  158. with cm():
  159. # Do stuff
  160. ``ContextDecorator`` lets you instead write::
  161. @cm()
  162. def f():
  163. # Do stuff
  164. It makes it clear that the ``cm`` applies to the whole function, rather than
  165. just a piece of it (and saving an indentation level is nice, too).
  166. Existing context managers that already have a base class can be extended by
  167. using ``ContextDecorator`` as a mixin class::
  168. from contextlib import ContextDecorator
  169. class mycontext(ContextBaseClass, ContextDecorator):
  170. def __enter__(self):
  171. return self
  172. def __exit__(self, *exc):
  173. return False
  174. .. note::
  175. As the decorated function must be able to be called multiple times, the
  176. underlying context manager must support use in multiple :keyword:`with`
  177. statements. If this is not the case, then the original construct with the
  178. explicit :keyword:`with` statement inside the function should be used.
  179. .. versionadded:: 3.2
  180. .. class:: ExitStack()
  181. A context manager that is designed to make it easy to programmatically
  182. combine other context managers and cleanup functions, especially those
  183. that are optional or otherwise driven by input data.
  184. For example, a set of files may easily be handled in a single with
  185. statement as follows::
  186. with ExitStack() as stack:
  187. files = [stack.enter_context(open(fname)) for fname in filenames]
  188. # All opened files will automatically be closed at the end of
  189. # the with statement, even if attempts to open files later
  190. # in the list raise an exception
  191. Each instance maintains a stack of registered callbacks that are called in
  192. reverse order when the instance is closed (either explicitly or implicitly
  193. at the end of a :keyword:`with` statement). Note that callbacks are *not*
  194. invoked implicitly when the context stack instance is garbage collected.
  195. This stack model is used so that context managers that acquire their
  196. resources in their ``__init__`` method (such as file objects) can be
  197. handled correctly.
  198. Since registered callbacks are invoked in the reverse order of
  199. registration, this ends up behaving as if multiple nested :keyword:`with`
  200. statements had been used with the registered set of callbacks. This even
  201. extends to exception handling - if an inner callback suppresses or replaces
  202. an exception, then outer callbacks will be passed arguments based on that
  203. updated state.
  204. This is a relatively low level API that takes care of the details of
  205. correctly unwinding the stack of exit callbacks. It provides a suitable
  206. foundation for higher level context managers that manipulate the exit
  207. stack in application specific ways.
  208. .. versionadded:: 3.3
  209. .. method:: enter_context(cm)
  210. Enters a new context manager and adds its :meth:`__exit__` method to
  211. the callback stack. The return value is the result of the context
  212. manager's own :meth:`__enter__` method.
  213. These context managers may suppress exceptions just as they normally
  214. would if used directly as part of a :keyword:`with` statement.
  215. .. method:: push(exit)
  216. Adds a context manager's :meth:`__exit__` method to the callback stack.
  217. As ``__enter__`` is *not* invoked, this method can be used to cover
  218. part of an :meth:`__enter__` implementation with a context manager's own
  219. :meth:`__exit__` method.
  220. If passed an object that is not a context manager, this method assumes
  221. it is a callback with the same signature as a context manager's
  222. :meth:`__exit__` method and adds it directly to the callback stack.
  223. By returning true values, these callbacks can suppress exceptions the
  224. same way context manager :meth:`__exit__` methods can.
  225. The passed in object is returned from the function, allowing this
  226. method to be used as a function decorator.
  227. .. method:: callback(callback, *args, **kwds)
  228. Accepts an arbitrary callback function and arguments and adds it to
  229. the callback stack.
  230. Unlike the other methods, callbacks added this way cannot suppress
  231. exceptions (as they are never passed the exception details).
  232. The passed in callback is returned from the function, allowing this
  233. method to be used as a function decorator.
  234. .. method:: pop_all()
  235. Transfers the callback stack to a fresh :class:`ExitStack` instance
  236. and returns it. No callbacks are invoked by this operation - instead,
  237. they will now be invoked when the new stack is closed (either
  238. explicitly or implicitly at the end of a :keyword:`with` statement).
  239. For example, a group of files can be opened as an "all or nothing"
  240. operation as follows::
  241. with ExitStack() as stack:
  242. files = [stack.enter_context(open(fname)) for fname in filenames]
  243. # Hold onto the close method, but don't call it yet.
  244. close_files = stack.pop_all().close
  245. # If opening any file fails, all previously opened files will be
  246. # closed automatically. If all files are opened successfully,
  247. # they will remain open even after the with statement ends.
  248. # close_files() can then be invoked explicitly to close them all.
  249. .. method:: close()
  250. Immediately unwinds the callback stack, invoking callbacks in the
  251. reverse order of registration. For any context managers and exit
  252. callbacks registered, the arguments passed in will indicate that no
  253. exception occurred.
  254. Examples and Recipes
  255. --------------------
  256. This section describes some examples and recipes for making effective use of
  257. the tools provided by :mod:`contextlib`.
  258. Supporting a variable number of context managers
  259. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  260. The primary use case for :class:`ExitStack` is the one given in the class
  261. documentation: supporting a variable number of context managers and other
  262. cleanup operations in a single :keyword:`with` statement. The variability
  263. may come from the number of context managers needed being driven by user
  264. input (such as opening a user specified collection of files), or from
  265. some of the context managers being optional::
  266. with ExitStack() as stack:
  267. for resource in resources:
  268. stack.enter_context(resource)
  269. if need_special_resource():
  270. special = acquire_special_resource()
  271. stack.callback(release_special_resource, special)
  272. # Perform operations that use the acquired resources
  273. As shown, :class:`ExitStack` also makes it quite easy to use :keyword:`with`
  274. statements to manage arbitrary resources that don't natively support the
  275. context management protocol.
  276. Simplifying support for single optional context managers
  277. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  278. In the specific case of a single optional context manager, :class:`ExitStack`
  279. instances can be used as a "do nothing" context manager, allowing a context
  280. manager to easily be omitted without affecting the overall structure of
  281. the source code::
  282. def debug_trace(details):
  283. if __debug__:
  284. return TraceContext(details)
  285. # Don't do anything special with the context in release mode
  286. return ExitStack()
  287. with debug_trace():
  288. # Suite is traced in debug mode, but runs normally otherwise
  289. Catching exceptions from ``__enter__`` methods
  290. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  291. It is occasionally desirable to catch exceptions from an ``__enter__``
  292. method implementation, *without* inadvertently catching exceptions from
  293. the :keyword:`with` statement body or the context manager's ``__exit__``
  294. method. By using :class:`ExitStack` the steps in the context management
  295. protocol can be separated slightly in order to allow this::
  296. stack = ExitStack()
  297. try:
  298. x = stack.enter_context(cm)
  299. except Exception:
  300. # handle __enter__ exception
  301. else:
  302. with stack:
  303. # Handle normal case
  304. Actually needing to do this is likely to indicate that the underlying API
  305. should be providing a direct resource management interface for use with
  306. :keyword:`try`/:keyword:`except`/:keyword:`finally` statements, but not
  307. all APIs are well designed in that regard. When a context manager is the
  308. only resource management API provided, then :class:`ExitStack` can make it
  309. easier to handle various situations that can't be handled directly in a
  310. :keyword:`with` statement.
  311. Cleaning up in an ``__enter__`` implementation
  312. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  313. As noted in the documentation of :meth:`ExitStack.push`, this
  314. method can be useful in cleaning up an already allocated resource if later
  315. steps in the :meth:`__enter__` implementation fail.
  316. Here's an example of doing this for a context manager that accepts resource
  317. acquisition and release functions, along with an optional validation function,
  318. and maps them to the context management protocol::
  319. from contextlib import contextmanager, ExitStack
  320. class ResourceManager:
  321. def __init__(self, acquire_resource, release_resource, check_resource_ok=None):
  322. self.acquire_resource = acquire_resource
  323. self.release_resource = release_resource
  324. if check_resource_ok is None:
  325. def check_resource_ok(resource):
  326. return True
  327. self.check_resource_ok = check_resource_ok
  328. @contextmanager
  329. def _cleanup_on_error(self):
  330. with ExitStack() as stack:
  331. stack.push(self)
  332. yield
  333. # The validation check passed and didn't raise an exception
  334. # Accordingly, we want to keep the resource, and pass it
  335. # back to our caller
  336. stack.pop_all()
  337. def __enter__(self):
  338. resource = self.acquire_resource()
  339. with self._cleanup_on_error():
  340. if not self.check_resource_ok(resource):
  341. msg = "Failed validation for {!r}"
  342. raise RuntimeError(msg.format(resource))
  343. return resource
  344. def __exit__(self, *exc_details):
  345. # We don't need to duplicate any of our resource release logic
  346. self.release_resource()
  347. Replacing any use of ``try-finally`` and flag variables
  348. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  349. A pattern you will sometimes see is a ``try-finally`` statement with a flag
  350. variable to indicate whether or not the body of the ``finally`` clause should
  351. be executed. In its simplest form (that can't already be handled just by
  352. using an ``except`` clause instead), it looks something like this::
  353. cleanup_needed = True
  354. try:
  355. result = perform_operation()
  356. if result:
  357. cleanup_needed = False
  358. finally:
  359. if cleanup_needed:
  360. cleanup_resources()
  361. As with any ``try`` statement based code, this can cause problems for
  362. development and review, because the setup code and the cleanup code can end
  363. up being separated by arbitrarily long sections of code.
  364. :class:`ExitStack` makes it possible to instead register a callback for
  365. execution at the end of a ``with`` statement, and then later decide to skip
  366. executing that callback::
  367. from contextlib import ExitStack
  368. with ExitStack() as stack:
  369. stack.callback(cleanup_resources)
  370. result = perform_operation()
  371. if result:
  372. stack.pop_all()
  373. This allows the intended cleanup up behaviour to be made explicit up front,
  374. rather than requiring a separate flag variable.
  375. If a particular application uses this pattern a lot, it can be simplified
  376. even further by means of a small helper class::
  377. from contextlib import ExitStack
  378. class Callback(ExitStack):
  379. def __init__(self, callback, *args, **kwds):
  380. super(Callback, self).__init__()
  381. self.callback(callback, *args, **kwds)
  382. def cancel(self):
  383. self.pop_all()
  384. with Callback(cleanup_resources) as cb:
  385. result = perform_operation()
  386. if result:
  387. cb.cancel()
  388. If the resource cleanup isn't already neatly bundled into a standalone
  389. function, then it is still possible to use the decorator form of
  390. :meth:`ExitStack.callback` to declare the resource cleanup in
  391. advance::
  392. from contextlib import ExitStack
  393. with ExitStack() as stack:
  394. @stack.callback
  395. def cleanup_resources():
  396. ...
  397. result = perform_operation()
  398. if result:
  399. stack.pop_all()
  400. Due to the way the decorator protocol works, a callback function
  401. declared this way cannot take any parameters. Instead, any resources to
  402. be released must be accessed as closure variables.
  403. Using a context manager as a function decorator
  404. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  405. :class:`ContextDecorator` makes it possible to use a context manager in
  406. both an ordinary ``with`` statement and also as a function decorator.
  407. For example, it is sometimes useful to wrap functions or groups of statements
  408. with a logger that can track the time of entry and time of exit. Rather than
  409. writing both a function decorator and a context manager for the task,
  410. inheriting from :class:`ContextDecorator` provides both capabilities in a
  411. single definition::
  412. from contextlib import ContextDecorator
  413. import logging
  414. logging.basicConfig(level=logging.INFO)
  415. class track_entry_and_exit(ContextDecorator):
  416. def __init__(self, name):
  417. self.name = name
  418. def __enter__(self):
  419. logging.info('Entering: {}'.format(self.name))
  420. def __exit__(self, exc_type, exc, exc_tb):
  421. logging.info('Exiting: {}'.format(self.name))
  422. Instances of this class can be used as both a context manager::
  423. with track_entry_and_exit('widget loader'):
  424. print('Some time consuming activity goes here')
  425. load_widget()
  426. And also as a function decorator::
  427. @track_entry_and_exit('widget loader')
  428. def activity():
  429. print('Some time consuming activity goes here')
  430. load_widget()
  431. Note that there is one additional limitation when using context managers
  432. as function decorators: there's no way to access the return value of
  433. :meth:`__enter__`. If that value is needed, then it is still necessary to use
  434. an explicit ``with`` statement.
  435. .. seealso::
  436. :pep:`343` - The "with" statement
  437. The specification, background, and examples for the Python :keyword:`with`
  438. statement.
  439. .. _single-use-reusable-and-reentrant-cms:
  440. Single use, reusable and reentrant context managers
  441. ---------------------------------------------------
  442. Most context managers are written in a way that means they can only be
  443. used effectively in a :keyword:`with` statement once. These single use
  444. context managers must be created afresh each time they're used -
  445. attempting to use them a second time will trigger an exception or
  446. otherwise not work correctly.
  447. This common limitation means that it is generally advisable to create
  448. context managers directly in the header of the :keyword:`with` statement
  449. where they are used (as shown in all of the usage examples above).
  450. Files are an example of effectively single use context managers, since
  451. the first :keyword:`with` statement will close the file, preventing any
  452. further IO operations using that file object.
  453. Context managers created using :func:`contextmanager` are also single use
  454. context managers, and will complain about the underlying generator failing
  455. to yield if an attempt is made to use them a second time::
  456. >>> from contextlib import contextmanager
  457. >>> @contextmanager
  458. ... def singleuse():
  459. ... print("Before")
  460. ... yield
  461. ... print("After")
  462. ...
  463. >>> cm = singleuse()
  464. >>> with cm:
  465. ... pass
  466. ...
  467. Before
  468. After
  469. >>> with cm:
  470. ... pass
  471. ...
  472. Traceback (most recent call last):
  473. ...
  474. RuntimeError: generator didn't yield
  475. .. _reentrant-cms:
  476. Reentrant context managers
  477. ^^^^^^^^^^^^^^^^^^^^^^^^^^
  478. More sophisticated context managers may be "reentrant". These context
  479. managers can not only be used in multiple :keyword:`with` statements,
  480. but may also be used *inside* a :keyword:`with` statement that is already
  481. using the same context manager.
  482. :class:`threading.RLock` is an example of a reentrant context manager, as are
  483. :func:`suppress` and :func:`redirect_stdout`. Here's a very simple example of
  484. reentrant use::
  485. >>> from contextlib import redirect_stdout
  486. >>> from io import StringIO
  487. >>> stream = StringIO()
  488. >>> write_to_stream = redirect_stdout(stream)
  489. >>> with write_to_stream:
  490. ... print("This is written to the stream rather than stdout")
  491. ... with write_to_stream:
  492. ... print("This is also written to the stream")
  493. ...
  494. >>> print("This is written directly to stdout")
  495. This is written directly to stdout
  496. >>> print(stream.getvalue())
  497. This is written to the stream rather than stdout
  498. This is also written to the stream
  499. Real world examples of reentrancy are more likely to involve multiple
  500. functions calling each other and hence be far more complicated than this
  501. example.
  502. Note also that being reentrant is *not* the same thing as being thread safe.
  503. :func:`redirect_stdout`, for example, is definitely not thread safe, as it
  504. makes a global modification to the system state by binding :data:`sys.stdout`
  505. to a different stream.
  506. .. _reusable-cms:
  507. Reusable context managers
  508. ^^^^^^^^^^^^^^^^^^^^^^^^^
  509. Distinct from both single use and reentrant context managers are "reusable"
  510. context managers (or, to be completely explicit, "reusable, but not
  511. reentrant" context managers, since reentrant context managers are also
  512. reusable). These context managers support being used multiple times, but
  513. will fail (or otherwise not work correctly) if the specific context manager
  514. instance has already been used in a containing with statement.
  515. :class:`threading.Lock` is an example of a reusable, but not reentrant,
  516. context manager (for a reentrant lock, it is necessary to use
  517. :class:`threading.RLock` instead).
  518. Another example of a reusable, but not reentrant, context manager is
  519. :class:`ExitStack`, as it invokes *all* currently registered callbacks
  520. when leaving any with statement, regardless of where those callbacks
  521. were added::
  522. >>> from contextlib import ExitStack
  523. >>> stack = ExitStack()
  524. >>> with stack:
  525. ... stack.callback(print, "Callback: from first context")
  526. ... print("Leaving first context")
  527. ...
  528. Leaving first context
  529. Callback: from first context
  530. >>> with stack:
  531. ... stack.callback(print, "Callback: from second context")
  532. ... print("Leaving second context")
  533. ...
  534. Leaving second context
  535. Callback: from second context
  536. >>> with stack:
  537. ... stack.callback(print, "Callback: from outer context")
  538. ... with stack:
  539. ... stack.callback(print, "Callback: from inner context")
  540. ... print("Leaving inner context")
  541. ... print("Leaving outer context")
  542. ...
  543. Leaving inner context
  544. Callback: from inner context
  545. Callback: from outer context
  546. Leaving outer context
  547. As the output from the example shows, reusing a single stack object across
  548. multiple with statements works correctly, but attempting to nest them
  549. will cause the stack to be cleared at the end of the innermost with
  550. statement, which is unlikely to be desirable behaviour.
  551. Using separate :class:`ExitStack` instances instead of reusing a single
  552. instance avoids that problem::
  553. >>> from contextlib import ExitStack
  554. >>> with ExitStack() as outer_stack:
  555. ... outer_stack.callback(print, "Callback: from outer context")
  556. ... with ExitStack() as inner_stack:
  557. ... inner_stack.callback(print, "Callback: from inner context")
  558. ... print("Leaving inner context")
  559. ... print("Leaving outer context")
  560. ...
  561. Leaving inner context
  562. Callback: from inner context
  563. Leaving outer context
  564. Callback: from outer context