summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/contextlib.py6
-rw-r--r--Lib/test/test_contextlib.py8
-rw-r--r--Lib/test/test_with.py6
-rw-r--r--Misc/NEWS4
4 files changed, 17 insertions, 7 deletions
diff --git a/Lib/contextlib.py b/Lib/contextlib.py
index 379c251..5377987 100644
--- a/Lib/contextlib.py
+++ b/Lib/contextlib.py
@@ -34,7 +34,7 @@ class ContextDecorator(object):
class _GeneratorContextManager(ContextDecorator):
"""Helper for @contextmanager decorator."""
- def __init__(self, func, *args, **kwds):
+ def __init__(self, func, args, kwds):
self.gen = func(*args, **kwds)
self.func, self.args, self.kwds = func, args, kwds
# 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
# CM must be recreated each time a decorated function is
# called
- return self.__class__(self.func, *self.args, **self.kwds)
+ return self.__class__(self.func, self.args, self.kwds)
def __enter__(self):
try:
@@ -130,7 +130,7 @@ def contextmanager(func):
"""
@wraps(func)
def helper(*args, **kwds):
- return _GeneratorContextManager(func, *args, **kwds)
+ return _GeneratorContextManager(func, args, kwds)
return helper
diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py
index adafc9f..78741f5 100644
--- a/Lib/test/test_contextlib.py
+++ b/Lib/test/test_contextlib.py
@@ -147,6 +147,14 @@ def woohoo():
baz = self._create_contextmanager_attribs()(None)
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):
diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py
index 5dbd1e6..e8d789b 100644
--- a/Lib/test/test_with.py
+++ b/Lib/test/test_with.py
@@ -11,8 +11,8 @@ from contextlib import _GeneratorContextManager, contextmanager
class MockContextManager(_GeneratorContextManager):
- def __init__(self, func, *args, **kwds):
- super().__init__(func, *args, **kwds)
+ def __init__(self, *args):
+ super().__init__(*args)
self.enter_called = False
self.exit_called = False
self.exit_args = None
@@ -30,7 +30,7 @@ class MockContextManager(_GeneratorContextManager):
def mock_contextmanager(func):
def helper(*args, **kwds):
- return MockContextManager(func, *args, **kwds)
+ return MockContextManager(func, args, kwds)
return helper
diff --git a/Misc/NEWS b/Misc/NEWS
index 4605ccc..3ecc73d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -22,10 +22,12 @@ Core and Builtins
coroutines only; add new opcode: GET_YIELD_FROM_ITER; fix generators wrapper
used in types.coroutine to be instance of collections.abc.Generator.
-
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 #24489: ensure a previously set C errno doesn't disturb cmath.polar().