Skip to content

Commit c7ac7c0

Browse files
authored
Fix - Improve check for invalid PEP 585 syntax (#4345)
Followup to #4340
1 parent d5f657f commit c7ac7c0

File tree

5 files changed

+26
-5
lines changed

5 files changed

+26
-5
lines changed

pylint/checkers/utils.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1361,7 +1361,14 @@ def is_node_in_type_annotation_context(node: astroid.node_classes.NodeNG) -> boo
13611361
isinstance(parent_node, astroid.AnnAssign)
13621362
and parent_node.annotation == current_node
13631363
or isinstance(parent_node, astroid.Arguments)
1364-
and current_node in parent_node.annotations
1364+
and current_node
1365+
in (
1366+
*parent_node.annotations,
1367+
*parent_node.posonlyargs_annotations,
1368+
*parent_node.kwonlyargs_annotations,
1369+
parent_node.varargannotation,
1370+
parent_node.kwargannotation,
1371+
)
13651372
or isinstance(parent_node, astroid.FunctionDef)
13661373
and parent_node.returns == current_node
13671374
):

tests/functional/p/postponed_evaluation_pep585.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dataclasses
1010
import typing
1111
from dataclasses import dataclass
12-
from typing import Dict, NamedTuple, TypedDict, Union, Tuple
12+
from typing import Any, Dict, NamedTuple, TypedDict, Union, Tuple
1313

1414

1515
AliasInvalid = list[int] # [unsubscriptable-object]
@@ -128,3 +128,6 @@ def func4(arg=list[int]): # [unsubscriptable-object]
128128

129129
def func5(arg1: list[int], arg2=set[int]): # [unsubscriptable-object]
130130
pass
131+
132+
def func6(arg1: list[int], /, *args: tuple[str], arg2: set[int], **kwargs: dict[str, Any]):
133+
pass

tests/functional/p/postponed_evaluation_pep585_error.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
This check requires Python 3.7 or Python 3.8!
44
Testing with 3.8 only, to support TypedDict.
55
"""
6-
# pylint: disable=missing-docstring,unused-argument,unused-import,too-few-public-methods,invalid-name,inherit-non-class,unsupported-binary-operation,unused-variable
6+
# pylint: disable=missing-docstring,unused-argument,unused-import,too-few-public-methods,invalid-name,inherit-non-class,unsupported-binary-operation,unused-variable,line-too-long
77
import collections
88
import dataclasses
99
import typing
1010
from dataclasses import dataclass
11-
from typing import Dict, NamedTuple, TypedDict, Union
11+
from typing import Any, Dict, NamedTuple, TypedDict, Union
1212

1313

1414
AliasInvalid = list[int] # [unsubscriptable-object]
@@ -110,3 +110,7 @@ def func4(var=list[int]): # [unsubscriptable-object]
110110

111111
def func5(arg1: list[int], arg2=set[int]): # [unsubscriptable-object,unsubscriptable-object]
112112
pass
113+
114+
def func6(arg1: list[int], /, *args: tuple[str], arg2: set[int], **kwargs: dict[str, Any]):
115+
# -1:[unsubscriptable-object,unsubscriptable-object,unsubscriptable-object,unsubscriptable-object]
116+
pass

tests/functional/p/postponed_evaluation_pep585_error.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,7 @@ unsubscriptable-object:106:11:func3:Value 'list' is unsubscriptable
4343
unsubscriptable-object:108:14:func4:Value 'list' is unsubscriptable
4444
unsubscriptable-object:111:16:func5:Value 'list' is unsubscriptable
4545
unsubscriptable-object:111:32:func5:Value 'set' is unsubscriptable
46+
unsubscriptable-object:114:75:func6:Value 'dict' is unsubscriptable
47+
unsubscriptable-object:114:16:func6:Value 'list' is unsubscriptable
48+
unsubscriptable-object:114:55:func6:Value 'set' is unsubscriptable
49+
unsubscriptable-object:114:37:func6:Value 'tuple' is unsubscriptable

tests/functional/p/postponed_evaluation_pep585_py39.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import dataclasses
55
import typing
66
from dataclasses import dataclass
7-
from typing import Dict, NamedTuple, TypedDict, Union, Tuple
7+
from typing import Any, Dict, NamedTuple, TypedDict, Union, Tuple
88

99

1010
AliasValid = list[int]
@@ -123,3 +123,6 @@ def func4(var=list[int]):
123123

124124
def func5(arg1: list[int], arg2=set[int]):
125125
pass
126+
127+
def func6(arg1: list[int], /, *args: tuple[str], arg2: set[int], **kwargs: dict[str, Any]):
128+
pass

0 commit comments

Comments
 (0)