summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Mueller <30130371+cdce8p@users.noreply.github.com>2021-04-12 13:25:53 +0200
committerGitHub <noreply@github.com>2021-04-12 13:25:53 +0200
commitc7ac7c0ec339e9a8d105ccac0e59e65cacb79272 (patch)
tree01b23669d9a3331e48fe6b327aae5d5d0f5727b4
parentd5f657f110d66e769023f7eb2b6d9d511849a934 (diff)
downloadpylint-git-c7ac7c0ec339e9a8d105ccac0e59e65cacb79272.tar.gz
Fix - Improve check for invalid PEP 585 syntax (#4345)
Followup to #4340
-rw-r--r--pylint/checkers/utils.py9
-rw-r--r--tests/functional/p/postponed_evaluation_pep585.py5
-rw-r--r--tests/functional/p/postponed_evaluation_pep585_error.py8
-rw-r--r--tests/functional/p/postponed_evaluation_pep585_error.txt4
-rw-r--r--tests/functional/p/postponed_evaluation_pep585_py39.py5
5 files changed, 26 insertions, 5 deletions
diff --git a/pylint/checkers/utils.py b/pylint/checkers/utils.py
index 4fefef61c..edbc4b489 100644
--- a/pylint/checkers/utils.py
+++ b/pylint/checkers/utils.py
@@ -1361,7 +1361,14 @@ def is_node_in_type_annotation_context(node: astroid.node_classes.NodeNG) -> boo
isinstance(parent_node, astroid.AnnAssign)
and parent_node.annotation == current_node
or isinstance(parent_node, astroid.Arguments)
- and current_node in parent_node.annotations
+ and current_node
+ in (
+ *parent_node.annotations,
+ *parent_node.posonlyargs_annotations,
+ *parent_node.kwonlyargs_annotations,
+ parent_node.varargannotation,
+ parent_node.kwargannotation,
+ )
or isinstance(parent_node, astroid.FunctionDef)
and parent_node.returns == current_node
):
diff --git a/tests/functional/p/postponed_evaluation_pep585.py b/tests/functional/p/postponed_evaluation_pep585.py
index 2a2f30ccf..889155a0f 100644
--- a/tests/functional/p/postponed_evaluation_pep585.py
+++ b/tests/functional/p/postponed_evaluation_pep585.py
@@ -9,7 +9,7 @@ import collections
import dataclasses
import typing
from dataclasses import dataclass
-from typing import Dict, NamedTuple, TypedDict, Union, Tuple
+from typing import Any, Dict, NamedTuple, TypedDict, Union, Tuple
AliasInvalid = list[int] # [unsubscriptable-object]
@@ -128,3 +128,6 @@ def func4(arg=list[int]): # [unsubscriptable-object]
def func5(arg1: list[int], arg2=set[int]): # [unsubscriptable-object]
pass
+
+def func6(arg1: list[int], /, *args: tuple[str], arg2: set[int], **kwargs: dict[str, Any]):
+ pass
diff --git a/tests/functional/p/postponed_evaluation_pep585_error.py b/tests/functional/p/postponed_evaluation_pep585_error.py
index 7eaf9b05c..71f09dc4c 100644
--- a/tests/functional/p/postponed_evaluation_pep585_error.py
+++ b/tests/functional/p/postponed_evaluation_pep585_error.py
@@ -3,12 +3,12 @@
This check requires Python 3.7 or Python 3.8!
Testing with 3.8 only, to support TypedDict.
"""
-# pylint: disable=missing-docstring,unused-argument,unused-import,too-few-public-methods,invalid-name,inherit-non-class,unsupported-binary-operation,unused-variable
+# 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
import collections
import dataclasses
import typing
from dataclasses import dataclass
-from typing import Dict, NamedTuple, TypedDict, Union
+from typing import Any, Dict, NamedTuple, TypedDict, Union
AliasInvalid = list[int] # [unsubscriptable-object]
@@ -110,3 +110,7 @@ def func4(var=list[int]): # [unsubscriptable-object]
def func5(arg1: list[int], arg2=set[int]): # [unsubscriptable-object,unsubscriptable-object]
pass
+
+def func6(arg1: list[int], /, *args: tuple[str], arg2: set[int], **kwargs: dict[str, Any]):
+ # -1:[unsubscriptable-object,unsubscriptable-object,unsubscriptable-object,unsubscriptable-object]
+ pass
diff --git a/tests/functional/p/postponed_evaluation_pep585_error.txt b/tests/functional/p/postponed_evaluation_pep585_error.txt
index d3697dc67..3949a6253 100644
--- a/tests/functional/p/postponed_evaluation_pep585_error.txt
+++ b/tests/functional/p/postponed_evaluation_pep585_error.txt
@@ -43,3 +43,7 @@ unsubscriptable-object:106:11:func3:Value 'list' is unsubscriptable
unsubscriptable-object:108:14:func4:Value 'list' is unsubscriptable
unsubscriptable-object:111:16:func5:Value 'list' is unsubscriptable
unsubscriptable-object:111:32:func5:Value 'set' is unsubscriptable
+unsubscriptable-object:114:75:func6:Value 'dict' is unsubscriptable
+unsubscriptable-object:114:16:func6:Value 'list' is unsubscriptable
+unsubscriptable-object:114:55:func6:Value 'set' is unsubscriptable
+unsubscriptable-object:114:37:func6:Value 'tuple' is unsubscriptable
diff --git a/tests/functional/p/postponed_evaluation_pep585_py39.py b/tests/functional/p/postponed_evaluation_pep585_py39.py
index 75c109a0d..98201a6d8 100644
--- a/tests/functional/p/postponed_evaluation_pep585_py39.py
+++ b/tests/functional/p/postponed_evaluation_pep585_py39.py
@@ -4,7 +4,7 @@ import collections
import dataclasses
import typing
from dataclasses import dataclass
-from typing import Dict, NamedTuple, TypedDict, Union, Tuple
+from typing import Any, Dict, NamedTuple, TypedDict, Union, Tuple
AliasValid = list[int]
@@ -123,3 +123,6 @@ def func4(var=list[int]):
def func5(arg1: list[int], arg2=set[int]):
pass
+
+def func6(arg1: list[int], /, *args: tuple[str], arg2: set[int], **kwargs: dict[str, Any]):
+ pass