diff options
| author | Guido van Rossum <guido@python.org> | 2016-11-29 09:46:21 -0800 |
|---|---|---|
| committer | Guido van Rossum <guido@python.org> | 2016-11-29 09:46:21 -0800 |
| commit | 61f0a0261f0fbfd0a6b981c370a8808aad00b107 (patch) | |
| tree | 2e5068d5f4686c608561ee54fbacf6d1e4dc3ea2 /Lib/typing.py | |
| parent | 47a9a4bedaa343e72898b2c7534d27f3e0cf4ff5 (diff) | |
| download | cpython-git-61f0a0261f0fbfd0a6b981c370a8808aad00b107.tar.gz | |
Issue #28790: Fix error when using Generic and __slots__ (Ivan L)
Diffstat (limited to 'Lib/typing.py')
| -rw-r--r-- | Lib/typing.py | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/Lib/typing.py b/Lib/typing.py index 1a943aca20..34845b747a 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -870,6 +870,17 @@ def _make_subclasshook(cls): return __extrahook__ +def _no_slots_copy(dct): + """Internal helper: copy class __dict__ and clean slots class variables. + (They will be re-created if necessary by normal class machinery.) + """ + dict_copy = dict(dct) + if '__slots__' in dict_copy: + for slot in dict_copy['__slots__']: + dict_copy.pop(slot, None) + return dict_copy + + class GenericMeta(TypingMeta, abc.ABCMeta): """Metaclass for generic types.""" @@ -967,7 +978,7 @@ class GenericMeta(TypingMeta, abc.ABCMeta): return self return self.__class__(self.__name__, self.__bases__, - dict(self.__dict__), + _no_slots_copy(self.__dict__), tvars=_type_vars(ev_args) if ev_args else None, args=ev_args, origin=ev_origin, @@ -1043,7 +1054,7 @@ class GenericMeta(TypingMeta, abc.ABCMeta): args = params return self.__class__(self.__name__, self.__bases__, - dict(self.__dict__), + _no_slots_copy(self.__dict__), tvars=tvars, args=args, origin=self, @@ -1059,7 +1070,8 @@ class GenericMeta(TypingMeta, abc.ABCMeta): return issubclass(instance.__class__, self) def __copy__(self): - return self.__class__(self.__name__, self.__bases__, dict(self.__dict__), + return self.__class__(self.__name__, self.__bases__, + _no_slots_copy(self.__dict__), self.__parameters__, self.__args__, self.__origin__, self.__extra__, self.__orig_bases__) |
