[Python-checkins] cpython (merge 3.4 -> 3.5): Issue #24336: The contextmanager decorator now works with functions with

serhiy.storchaka python-checkins at python.org
Sun Jun 28 16:12:22 CEST 2015


https://hg.python.org/cpython/rev/20aa7083057e
changeset:   96699:20aa7083057e
branch:      3.5
parent:      96695:85d49f65a410
parent:      96698:f0053d05ed6d
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sun Jun 28 17:08:35 2015 +0300
summary:
  Issue #24336: The contextmanager decorator now works with functions with
keyword arguments called "func" and "self".  Patch by Martin Panter.

files:
  Lib/contextlib.py           |  6 +++---
  Lib/test/test_contextlib.py |  8 ++++++++
  Lib/test/test_with.py       |  6 +++---
  Misc/NEWS                   |  4 +++-
  4 files changed, 17 insertions(+), 7 deletions(-)


diff --git a/Lib/contextlib.py b/Lib/contextlib.py
--- a/Lib/contextlib.py
+++ b/Lib/contextlib.py
@@ -34,7 +34,7 @@
 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 @@
         # _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 @@
     """
     @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
--- a/Lib/test/test_contextlib.py
+++ b/Lib/test/test_contextlib.py
@@ -147,6 +147,14 @@
         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
--- a/Lib/test/test_with.py
+++ b/Lib/test/test_with.py
@@ -11,8 +11,8 @@
 
 
 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 @@
 
 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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -22,10 +22,12 @@
   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().

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list