summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorNate <nate@so8r.es>2017-06-07 00:31:03 (GMT)
committerMariatta <Mariatta@users.noreply.github.com>2017-06-07 00:31:03 (GMT)
commit6fb12b5c43945f61f3da82e33eafb4ddae2296ee (patch)
treef93a4dd486df5795de6b73c06c959aad4aa3b4ac /Lib
parent063f0b358331322d84f85008e6c01f80ff321fd6 (diff)
downloadcpython-6fb12b5c43945f61f3da82e33eafb4ddae2296ee.zip
cpython-6fb12b5c43945f61f3da82e33eafb4ddae2296ee.tar.gz
cpython-6fb12b5c43945f61f3da82e33eafb4ddae2296ee.tar.bz2
bpo-29581: bpo-29581: Make ABCMeta.__new__ pass **kwargs to type.__new__ (GH-527) (GH-1282)
Many metaclasses in the standard library don't play nice with __init_subclass__. This bug makes ABCMeta in particular with __init_subclass__, which is an 80/20 solution for me personally. AFAICT, a general solution to this problem requires updating all metaclasses in the standard library to make sure they pass **kwargs to type.__new__, whereas this PR only fixes ABCMeta. For context, see https://bugs.python.org/issue29581. * added a test combining ABCMeta and __init_subclass__ * Added NEWS item (cherry picked from commit bd583ef9857d99f9145ad0bb2c4424cc0baa63fc) * [3.6] bpo-29581: Make ABCMeta.__new__ pass **kwargs to type.__new__ (GH-527) Many metaclasses in the standard library don't play nice with __init_subclass__. This bug makes ABCMeta in particular with __init_subclass__, which is an 80/20 solution for me personally. AFAICT, a general solution to this problem requires updating all metaclasses in the standard library to make sure they pass **kwargs to type.__new__, whereas this PR only fixes ABCMeta. For context, see https://bugs.python.org/issue29581. * added a test combining ABCMeta and __init_subclass__ * Added NEWS item. (cherry picked from commit bd583ef9857d99f9145ad0bb2c4424cc0baa63fc) * **kwargs -> ``kwargs`` in attempts to fix the Travis build. * Quote the **kwargs
Diffstat (limited to 'Lib')
-rw-r--r--Lib/abc.py4
-rw-r--r--Lib/test/test_abc.py12
2 files changed, 14 insertions, 2 deletions
diff --git a/Lib/abc.py b/Lib/abc.py
index 1cbf96a..43a34a0 100644
--- a/Lib/abc.py
+++ b/Lib/abc.py
@@ -129,8 +129,8 @@ class ABCMeta(type):
# external code.
_abc_invalidation_counter = 0
- def __new__(mcls, name, bases, namespace):
- cls = super().__new__(mcls, name, bases, namespace)
+ def __new__(mcls, name, bases, namespace, **kwargs):
+ cls = super().__new__(mcls, name, bases, namespace, **kwargs)
# Compute set of abstract method names
abstracts = {name
for name, value in namespace.items()
diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py
index e1765f0..4bc8382 100644
--- a/Lib/test/test_abc.py
+++ b/Lib/test/test_abc.py
@@ -404,5 +404,17 @@ class TestABC(unittest.TestCase):
self.assertEqual(B.counter, 1)
+class TestABCWithInitSubclass(unittest.TestCase):
+ def test_works_with_init_subclass(self):
+ saved_kwargs = {}
+ class ReceivesClassKwargs:
+ def __init_subclass__(cls, **kwargs):
+ super().__init_subclass__()
+ saved_kwargs.update(kwargs)
+ class Receiver(ReceivesClassKwargs, abc.ABC, x=1, y=2, z=3):
+ pass
+ self.assertEqual(saved_kwargs, dict(x=1, y=2, z=3))
+
+
if __name__ == "__main__":
unittest.main()