Does anyone have a real world example outside of python's file object implementation of an __enter__ and __exit__ use case? Preferably your own, since what I'm trying to achieve is a better way to conceptualize the cases where it would be used.
I've already read this.
There are many uses. Just in the standard library we have:
sqlite3; using the connection as a context manager translates to committing or aborting the transaction.unittest; usingassertRaisesas a context manager lets you assert an exception is raised, then test aspects of the exception.decimal;localcontextmanages decimal number precision, rounding, and other aspects.threadingobjects such as locks, semaphores and conditions are context managers too; letting you obtain a lock for a set of statements, etc.the
warningsmodule gives you a context manager to temporarily catch warnings.many libraries offer closing behaviour, just like the default file object. These include the
tarfileand thezipfilemodules.Python's own
test.test_supportmodule uses several context managers, to check for specific warnings, capturestdout, ignore specific exceptions and temporarily set environment variables.
Any time you want to detect when a block of code starts and / or ends, you want to use a context manager. Where before you'd use try: with a finally: suite to guarantee a cleanup, use a context manager instead.
There are a few examples on the Python Wiki.
The canonical answer is locks:
with (acquire some mutex):
# do stuff with mutex
Here's a Stack Overflow question and answer involving locks and the with statement.
I've found it useful to have a contextmanager version of os.chdir(): on exit it chdir()s back to the original directory.
This allows you to emulate a common (Bourne) shell-scripting pattern:
(
cd <some dir>
<do stuff>
)
I.e. you change to a new dir <some dir> inside a subshell (the ( )) so that you are sure to return to your original dir, even if the <do stuff> causes an error.
Compare the context manager and vanilla versions in Python. Vanilla:
original_dir = os.getcwd()
os.chdir(<some dir>)
try:
<do stuff>
finally:
os.chdir(original_dir)
Using a context manager:
with os.chdir(<some dir>):
<do stuff>
The latter is much nicer!
来源:https://stackoverflow.com/questions/19484175/other-builtin-or-practical-examples-of-python-with-statement-usage