Commit eab77040 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #24336: The contextmanager decorator now works with functions with

keyword arguments called "func" and "self".  Patch by Martin Panter.
parents 4801383c 101ff354
...@@ -34,7 +34,7 @@ class ContextDecorator(object): ...@@ -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): ...@@ -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:
...@@ -130,7 +130,7 @@ def contextmanager(func): ...@@ -130,7 +130,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
......
...@@ -147,6 +147,14 @@ def woohoo(): ...@@ -147,6 +147,14 @@ def woohoo():
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):
......
...@@ -11,8 +11,8 @@ from contextlib import _GeneratorContextManager, contextmanager ...@@ -11,8 +11,8 @@ from contextlib import _GeneratorContextManager, contextmanager
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
...@@ -30,7 +30,7 @@ class MockContextManager(_GeneratorContextManager): ...@@ -30,7 +30,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
......
...@@ -22,10 +22,12 @@ Core and Builtins ...@@ -22,10 +22,12 @@ Core and Builtins
coroutines only; add new opcode: GET_YIELD_FROM_ITER; fix generators wrapper coroutines only; add new opcode: GET_YIELD_FROM_ITER; fix generators wrapper
used in types.coroutine to be instance of collections.abc.Generator. used in types.coroutine to be instance of collections.abc.Generator.
Library Library
------- -------
- Issue #24336: The contextmanager decorator now works with functions with
keyword arguments called "func" and "self". Patch by Martin Panter.
- Issue #24522: Fix possible integer overflow in json accelerator module. - Issue #24522: Fix possible integer overflow in json accelerator module.
- 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().
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment