1
0
mirror of https://github.com/ARM-software/devlib.git synced 2025-02-07 13:40:48 +00:00

misc: Add batch_contextmanager

Convenience wrapper around standard contextlib.ExitStack class.
This commit is contained in:
Douglas RAILLARD 2019-05-09 16:21:00 +01:00 committed by Marc Bonnici
parent 71bd8b10ed
commit ded30eef00
2 changed files with 24 additions and 0 deletions

View File

@ -19,11 +19,13 @@ Miscellaneous functions that don't fit anywhere else.
""" """
from __future__ import division from __future__ import division
from contextlib import contextmanager
from functools import partial, reduce from functools import partial, reduce
from itertools import groupby from itertools import groupby
from operator import itemgetter from operator import itemgetter
import ctypes import ctypes
import functools
import logging import logging
import os import os
import pkgutil import pkgutil
@ -38,6 +40,11 @@ import wrapt
import warnings import warnings
try:
from contextlib import ExitStack
except AttributeError:
from contextlib2 import ExitStack
from past.builtins import basestring from past.builtins import basestring
# pylint: disable=redefined-builtin # pylint: disable=redefined-builtin
@ -695,3 +702,19 @@ def memoized(wrapped, instance, args, kwargs): # pylint: disable=unused-argumen
return __memo_cache[id_string] return __memo_cache[id_string]
return memoize_wrapper(*args, **kwargs) return memoize_wrapper(*args, **kwargs)
@contextmanager
def batch_contextmanager(f, kwargs_list):
"""
Return a context manager that will call the ``f`` callable with the keyword
arguments dict in the given list, in one go.
:param f: Callable expected to return a context manager.
:param kwargs_list: list of kwargs dictionaries to be used to call ``f``.
:type kwargs_list: list(dict)
"""
with ExitStack() as stack:
for kwargs in kwargs_list:
stack.enter_context(f(**kwargs))
yield

View File

@ -85,6 +85,7 @@ params = dict(
'wrapt', # Basic for construction of decorator functions 'wrapt', # Basic for construction of decorator functions
'future', # Python 2-3 compatibility 'future', # Python 2-3 compatibility
'enum34;python_version<"3.4"', # Enums for Python < 3.4 'enum34;python_version<"3.4"', # Enums for Python < 3.4
'contextlib2;python_version<"3.0"', # Python 3 contextlib backport for Python 2
'numpy<=1.16.4; python_version<"3"', 'numpy<=1.16.4; python_version<"3"',
'numpy; python_version>="3"', 'numpy; python_version>="3"',
'pandas<=0.24.2; python_version<"3"', 'pandas<=0.24.2; python_version<"3"',