Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions mypy/semanal.py
Original file line number Diff line number Diff line change
Expand Up @@ -867,11 +867,8 @@ def analyze_func_def(self, defn: FuncDef) -> None:
assert isinstance(result, ProperType)
if isinstance(result, CallableType):
# type guards need to have a positional argument, to spec
if (
result.type_guard
and ARG_POS not in result.arg_kinds[self.is_class_scope() :]
and not defn.is_static
):
skip_self = self.is_class_scope() and not defn.is_static
if result.type_guard and ARG_POS not in result.arg_kinds[skip_self:]:
self.fail(
"TypeGuard functions must have a positional argument",
result,
Expand Down
23 changes: 21 additions & 2 deletions test-data/unit/check-typeguard.test
Original file line number Diff line number Diff line change
Expand Up @@ -602,12 +602,31 @@ def func(names: Tuple[str, ...]):
from typing_extensions import TypeGuard

class Z:
def typeguard(self, *, x: object) -> TypeGuard[int]: # E: TypeGuard functions must have a positional argument
def typeguard1(self, *, x: object) -> TypeGuard[int]: # line 4
...

@staticmethod
def typeguard2(x: object) -> TypeGuard[int]:
...

@staticmethod # line 11
def typeguard3(*, x: object) -> TypeGuard[int]:
...

def bad_typeguard(*, x: object) -> TypeGuard[int]: # E: TypeGuard functions must have a positional argument
def bad_typeguard(*, x: object) -> TypeGuard[int]: # line 15
...

# seperated outputs are due to a parsing difference (?)
[builtins fixtures/tuple.pyi]
[builtins fixtures/classmethod.pyi]
[out]
main:4: error: TypeGuard functions must have a positional argument
main:11: error: TypeGuard functions must have a positional argument
main:15: error: TypeGuard functions must have a positional argument
[out version>=3.8]
main:4: error: TypeGuard functions must have a positional argument
main:12: error: TypeGuard functions must have a positional argument
main:15: error: TypeGuard functions must have a positional argument

[case testTypeGuardWithKeywordArg]
from typing_extensions import TypeGuard
Expand Down