mirror of
https://github.com/kennethreitz/python-guide.git
synced 2026-06-05 14:50:19 +00:00
Fixes #686
This commit is contained in:
@@ -658,8 +658,10 @@ And now the generator approach using Python's own
|
||||
@contextmanager
|
||||
def custom_open(filename):
|
||||
f = open(filename)
|
||||
yield f
|
||||
f.close()
|
||||
try:
|
||||
yield f
|
||||
finally:
|
||||
f.close()
|
||||
|
||||
with custom_open('file') as f:
|
||||
contents = f.read()
|
||||
@@ -667,7 +669,9 @@ And now the generator approach using Python's own
|
||||
This works in exactly the same way as the class example above, albeit it's
|
||||
more terse. The ``custom_open`` function executes until it reaches the ``yield``
|
||||
statement. It then gives control back to the ``with`` statement, which assigns
|
||||
whatever was ``yield``'ed to `f` in the ``as f`` portion.
|
||||
whatever was ``yield``'ed to `f` in the ``as f`` portion. The ``finally`` clause
|
||||
ensures that ``close()`` is called whether or not there was an exception inside
|
||||
the ``with``.
|
||||
|
||||
Since the two approaches appear the same, we should follow the Zen of Python
|
||||
to decide when to use which. The class approach might be better if there's
|
||||
|
||||
Reference in New Issue
Block a user