diff --git a/mypy/stubgen.py b/mypy/stubgen.py index dafb446a835a1..6db5aa75d102f 100755 --- a/mypy/stubgen.py +++ b/mypy/stubgen.py @@ -851,6 +851,12 @@ def visit_class_def(self, o: ClassDef) -> None: base_types.append('metaclass=abc.ABCMeta') self.import_tracker.add_import('abc') self.import_tracker.require_name('abc') + elif self.analyzed and o.info.is_protocol: + type_str = 'Protocol' + if o.info.type_vars: + type_str += f'[{", ".join(o.info.type_vars)}]' + base_types.append(type_str) + self.add_typing_import('Protocol') if base_types: self.add('(%s)' % ', '.join(base_types)) self.add(':\n') diff --git a/test-data/unit/stubgen.test b/test-data/unit/stubgen.test index 6592791f9aa39..62fae21df4f4e 100644 --- a/test-data/unit/stubgen.test +++ b/test-data/unit/stubgen.test @@ -2581,6 +2581,30 @@ def f(x: int, y: int) -> int: ... @t.overload def f(x: t.Tuple[int, int]) -> int: ... +[case testProtocol_semanal] +from typing import Protocol, TypeVar + +class P(Protocol): + def f(self, x: int, y: int) -> str: + ... + +T = TypeVar('T') +T2 = TypeVar('T2') +class PT(Protocol[T, T2]): + def f(self, x: T) -> T2: + ... + +[out] +from typing import Protocol, TypeVar + +class P(Protocol): + def f(self, x: int, y: int) -> str: ... +T = TypeVar('T') +T2 = TypeVar('T2') + +class PT(Protocol[T, T2]): + def f(self, x: T) -> T2: ... + [case testNonDefaultKeywordOnlyArgAfterAsterisk] def func(*, non_default_kwarg: bool, default_kwarg: bool = True): ... [out]