summaryrefslogtreecommitdiffstats
path: root/Lib/typing.py
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-08-02 17:08:59 (GMT)
committerGitHub <noreply@github.com>2021-08-02 17:08:59 (GMT)
commit2cc19a5463c804b2f39b94de896d55dcb57a364c (patch)
treea92e648481d76d40bcbd84e4e54c74e24dabd2e8 /Lib/typing.py
parent9de590151d49f2988d3a5c4d30b9daf86616f6f3 (diff)
downloadcpython-2cc19a5463c804b2f39b94de896d55dcb57a364c.zip
cpython-2cc19a5463c804b2f39b94de896d55dcb57a364c.tar.gz
cpython-2cc19a5463c804b2f39b94de896d55dcb57a364c.tar.bz2
bpo-44806: Fix __init__ in subclasses of protocols (GH-27545)
Non-protocol subclasses of protocol ignore now the __init__ method inherited from protocol base classes. (cherry picked from commit 043cd60abed09edddc7185bcf7d039771acc734d) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib/typing.py')
-rw-r--r--Lib/typing.py12
1 files changed, 10 insertions, 2 deletions
diff --git a/Lib/typing.py b/Lib/typing.py
index e492bd2..6f884e1 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -1379,8 +1379,7 @@ def _is_callable_members_only(cls):
def _no_init(self, *args, **kwargs):
- if type(self)._is_protocol:
- raise TypeError('Protocols cannot be instantiated')
+ raise TypeError('Protocols cannot be instantiated')
def _caller(depth=1, default='__main__'):
try:
@@ -1523,6 +1522,15 @@ class Protocol(Generic, metaclass=_ProtocolMeta):
# We have nothing more to do for non-protocols...
if not cls._is_protocol:
+ if cls.__init__ == _no_init:
+ for base in cls.__mro__:
+ init = base.__dict__.get('__init__', _no_init)
+ if init != _no_init:
+ cls.__init__ = init
+ break
+ else:
+ # should not happen
+ cls.__init__ = object.__init__
return
# ... otherwise check consistency of bases, and prohibit instantiation.