[Python-Dev] Iterator version of contextlib.nested
Hagen Fürstenau
hfuerstenau at gmx.net
Fri Jun 12 17:18:18 CEST 2009
contextlib.nested has recently been deprecated on grounds of being
unnecessary now that the with statement accepts multiple context
managers. However, as has been mentioned before
(http://mail.python.org/pipermail/python-dev/2009-May/089359.html), that
doesn't cover the case of a variable number of context managers, i.e.
with contextlib.nested(*list_of_managers) as list_of_results:
or
with contexlib.nested(*iterator_of_managers):
It was suggested that in these use cases a custom context manager should
be implemented. However, it seems that such an implementation would be
an almost exact copy of the present code for "nested".
I'm proposing to add an iterator version of "nested" to contextlib
(possibly called "inested"), which takes an iterable of context managers
instead of a variable number of parameters. The implementation could be
taken over from the present "nested", only changing "def
nested(*managers)" to "def inested(managers)".
This has the advantage that an iterator can be passed to "inested", so
that each context managers is created in the context of all previous
ones, which was one of the reasons for introducing the multi-with
statement in the first place. "contextlib.inested" would therefore be
the generalization of the multi-with statement to a variable number of
managers (and "contextlib.nested" would stay deprecated).
- Hagen
More information about the Python-Dev
mailing list