Issue #24336: The contextmanager decorator now works with functions with
keyword arguments called "func" and "self". Patch by Martin Panter.
This commit is contained in:
parent
acac1e0e3b
commit
101ff3541c
|
@ -34,7 +34,7 @@ class ContextDecorator(object):
|
||||||
class _GeneratorContextManager(ContextDecorator):
|
class _GeneratorContextManager(ContextDecorator):
|
||||||
"""Helper for @contextmanager decorator."""
|
"""Helper for @contextmanager decorator."""
|
||||||
|
|
||||||
def __init__(self, func, *args, **kwds):
|
def __init__(self, func, args, kwds):
|
||||||
self.gen = func(*args, **kwds)
|
self.gen = func(*args, **kwds)
|
||||||
self.func, self.args, self.kwds = func, args, kwds
|
self.func, self.args, self.kwds = func, args, kwds
|
||||||
# Issue 19330: ensure context manager instances have good docstrings
|
# Issue 19330: ensure context manager instances have good docstrings
|
||||||
|
@ -52,7 +52,7 @@ class _GeneratorContextManager(ContextDecorator):
|
||||||
# _GCM instances are one-shot context managers, so the
|
# _GCM instances are one-shot context managers, so the
|
||||||
# CM must be recreated each time a decorated function is
|
# CM must be recreated each time a decorated function is
|
||||||
# called
|
# called
|
||||||
return self.__class__(self.func, *self.args, **self.kwds)
|
return self.__class__(self.func, self.args, self.kwds)
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
try:
|
try:
|
||||||
|
@ -123,7 +123,7 @@ def contextmanager(func):
|
||||||
"""
|
"""
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
def helper(*args, **kwds):
|
def helper(*args, **kwds):
|
||||||
return _GeneratorContextManager(func, *args, **kwds)
|
return _GeneratorContextManager(func, args, kwds)
|
||||||
return helper
|
return helper
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -111,6 +111,14 @@ class ContextManagerTestCase(unittest.TestCase):
|
||||||
baz = self._create_contextmanager_attribs()(None)
|
baz = self._create_contextmanager_attribs()(None)
|
||||||
self.assertEqual(baz.__doc__, "Whee!")
|
self.assertEqual(baz.__doc__, "Whee!")
|
||||||
|
|
||||||
|
def test_keywords(self):
|
||||||
|
# Ensure no keyword arguments are inhibited
|
||||||
|
@contextmanager
|
||||||
|
def woohoo(self, func, args, kwds):
|
||||||
|
yield (self, func, args, kwds)
|
||||||
|
with woohoo(self=11, func=22, args=33, kwds=44) as target:
|
||||||
|
self.assertEqual(target, (11, 22, 33, 44))
|
||||||
|
|
||||||
|
|
||||||
class ClosingTestCase(unittest.TestCase):
|
class ClosingTestCase(unittest.TestCase):
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,8 @@ from test.support import run_unittest
|
||||||
|
|
||||||
|
|
||||||
class MockContextManager(_GeneratorContextManager):
|
class MockContextManager(_GeneratorContextManager):
|
||||||
def __init__(self, func, *args, **kwds):
|
def __init__(self, *args):
|
||||||
super().__init__(func, *args, **kwds)
|
super().__init__(*args)
|
||||||
self.enter_called = False
|
self.enter_called = False
|
||||||
self.exit_called = False
|
self.exit_called = False
|
||||||
self.exit_args = None
|
self.exit_args = None
|
||||||
|
@ -31,7 +31,7 @@ class MockContextManager(_GeneratorContextManager):
|
||||||
|
|
||||||
def mock_contextmanager(func):
|
def mock_contextmanager(func):
|
||||||
def helper(*args, **kwds):
|
def helper(*args, **kwds):
|
||||||
return MockContextManager(func, *args, **kwds)
|
return MockContextManager(func, args, kwds)
|
||||||
return helper
|
return helper
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #24336: The contextmanager decorator now works with functions with
|
||||||
|
keyword arguments called "func" and "self". Patch by Martin Panter.
|
||||||
|
|
||||||
- Issue #24489: ensure a previously set C errno doesn't disturb cmath.polar().
|
- Issue #24489: ensure a previously set C errno doesn't disturb cmath.polar().
|
||||||
|
|
||||||
- Issue #5633: Fixed timeit when the statement is a string and the setup is not.
|
- Issue #5633: Fixed timeit when the statement is a string and the setup is not.
|
||||||
|
|
Loading…
Reference in New Issue