From c7ac7c0ec339e9a8d105ccac0e59e65cacb79272 Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:25:53 +0200 Subject: Fix - Improve check for invalid PEP 585 syntax (#4345) Followup to #4340 --- pylint/checkers/utils.py | 9 ++++++++- tests/functional/p/postponed_evaluation_pep585.py | 5 ++++- tests/functional/p/postponed_evaluation_pep585_error.py | 8 ++++++-- tests/functional/p/postponed_evaluation_pep585_error.txt | 4 ++++ tests/functional/p/postponed_evaluation_pep585_py39.py | 5 ++++- 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 -- cgit v1.2.1