diff options
author | Nate <nate@so8r.es> | 2017-06-07 00:31:03 (GMT) |
---|---|---|
committer | Mariatta <Mariatta@users.noreply.github.com> | 2017-06-07 00:31:03 (GMT) |
commit | 6fb12b5c43945f61f3da82e33eafb4ddae2296ee (patch) | |
tree | f93a4dd486df5795de6b73c06c959aad4aa3b4ac /Lib | |
parent | 063f0b358331322d84f85008e6c01f80ff321fd6 (diff) | |
download | cpython-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.py | 4 | ||||
-rw-r--r-- | Lib/test/test_abc.py | 12 |
2 files changed, 14 insertions, 2 deletions
@@ -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() |