diff options
Diffstat (limited to 'tests/functional/p/postponed')
16 files changed, 548 insertions, 0 deletions
diff --git a/tests/functional/p/postponed/postponed_evaluation_activated.py b/tests/functional/p/postponed/postponed_evaluation_activated.py new file mode 100644 index 000000000..3492fe5c2 --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_activated.py @@ -0,0 +1,28 @@ +# pylint: disable=missing-docstring,unused-argument,pointless-statement +# pylint: disable=too-few-public-methods,no-name-in-module +from __future__ import annotations + + +class Class: + @classmethod + def from_string(cls, source) -> Class: + ... + + def validate_b(self, obj: OtherClass) -> bool: + ... + + +class OtherClass: + ... + + +class Example: + obj: Other + + +class Other: + ... + + +class ExampleSelf: + next: ExampleSelf diff --git a/tests/functional/p/postponed/postponed_evaluation_activated.rc b/tests/functional/p/postponed/postponed_evaluation_activated.rc new file mode 100644 index 000000000..a17bb22da --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_activated.rc @@ -0,0 +1,2 @@ +[testoptions] +min_pyver=3.7 diff --git a/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.py b/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.py new file mode 100644 index 000000000..f9899f34a --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.py @@ -0,0 +1,28 @@ +# pylint: disable=missing-docstring,unused-argument,pointless-statement +# pylint: disable=too-few-public-methods,no-name-in-module +from __future__ import annotations as __annotations__ + + +class MyClass: + @classmethod + def from_string(cls, source) -> MyClass: + ... + + def validate_b(self, obj: OtherClass) -> bool: + ... + + +class OtherClass: + ... + + +class Example: + obj: Other + + +class Other: + ... + + +class ExampleSelf: + next: ExampleSelf diff --git a/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.rc b/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.rc new file mode 100644 index 000000000..a17bb22da --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.rc @@ -0,0 +1,2 @@ +[testoptions] +min_pyver=3.7 diff --git a/tests/functional/p/postponed/postponed_evaluation_not_activated.py b/tests/functional/p/postponed/postponed_evaluation_not_activated.py new file mode 100644 index 000000000..76e564a9a --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_not_activated.py @@ -0,0 +1,14 @@ +# pylint: disable=missing-docstring,unused-argument,pointless-statement +# pylint: disable=too-few-public-methods + +class Class: + @classmethod + def from_string(cls, source) -> Class: # [undefined-variable] + ... + + def validate_b(self, obj: OtherClass) -> bool: # [used-before-assignment] + ... + + +class OtherClass: + ... diff --git a/tests/functional/p/postponed/postponed_evaluation_not_activated.rc b/tests/functional/p/postponed/postponed_evaluation_not_activated.rc new file mode 100644 index 000000000..a17bb22da --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_not_activated.rc @@ -0,0 +1,2 @@ +[testoptions] +min_pyver=3.7 diff --git a/tests/functional/p/postponed/postponed_evaluation_not_activated.txt b/tests/functional/p/postponed/postponed_evaluation_not_activated.txt new file mode 100644 index 000000000..8d9630e04 --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_not_activated.txt @@ -0,0 +1,2 @@ +undefined-variable:6:36:6:41:Class.from_string:Undefined variable 'Class':UNDEFINED +used-before-assignment:9:30:9:40:Class.validate_b:Using variable 'OtherClass' before assignment:HIGH diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585.py b/tests/functional/p/postponed/postponed_evaluation_pep585.py new file mode 100644 index 000000000..2317228e5 --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_pep585.py @@ -0,0 +1,141 @@ +"""Test PEP 585 in combination with postponed evaluation PEP 563. + +This check requires Python 3.7 or 3.8! +Testing with 3.8 only, to support TypedDict. +""" + +# pylint: disable=missing-docstring,unused-argument,unused-import,too-few-public-methods,invalid-name +# pylint: disable=inherit-non-class,unsupported-binary-operation,wrong-import-position,ungrouped-imports +# pylint: disable=unused-variable,unnecessary-direct-lambda-call + +# Disabled because of a bug with pypy 3.8 see +# https://github.com/pylint-dev/pylint/pull/7918#issuecomment-1352737369 +# pylint: disable=multiple-statements + +from __future__ import annotations +import collections +import dataclasses +import typing +from dataclasses import dataclass +from typing import Any, Dict, NamedTuple, TypedDict, Union, Tuple + + +AliasInvalid = list[int] # [unsubscriptable-object] + +class CustomIntList(typing.List[int]): + pass + +class CustomIntListError(list[int]): # [unsubscriptable-object] + pass + +cast_variable = [1, 2, 3] +cast_variable = typing.cast(list[int], cast_variable) # [unsubscriptable-object] + +T = typing.TypeVar("T", list[int], str) # [unsubscriptable-object] + +(lambda x: 2)(list[int]) # [unsubscriptable-object] + + +# Check typing.NamedTuple +CustomNamedTuple = typing.NamedTuple( + "CustomNamedTuple", [("my_var", list[int])]) # [unsubscriptable-object] + +class CustomNamedTuple2(NamedTuple): + my_var: list[int] + +class CustomNamedTuple3(typing.NamedTuple): + my_var: list[int] + + +# Check typing.TypedDict +CustomTypedDict = TypedDict("CustomTypedDict", my_var=list[int]) # [unsubscriptable-object] + +CustomTypedDict2 = TypedDict("CustomTypedDict2", {"my_var": list[int]}) # [unsubscriptable-object] + +class CustomTypedDict3(TypedDict): + my_var: list[int] + +class CustomTypedDict4(typing.TypedDict): + my_var: list[int] + + +# Check dataclasses +def my_decorator(*args, **kwargs): + def wraps(*args, **kwargs): + pass + return wraps + +@dataclass +class CustomDataClass: + my_var: list[int] + +@dataclasses.dataclass +class CustomDataClass2: + my_var: list[int] + +@dataclass() +class CustomDataClass3: + my_var: list[int] + +@my_decorator +@dataclasses.dataclass +class CustomDataClass4: + my_var: list[int] + + +var1: set[int] +var2: collections.OrderedDict[str, int] +var3: dict[str, list[int]] +var4: Dict[str, list[int]] +var5: dict[tuple[int, int], str] +var6: Dict[tuple[int, int], str] +var7: list[list[int]] +var8: tuple[list[int]] +var9: int | list[str | int] +var10: Union[list[str], None] +var11: Union[Union[list[int], int]] + +def func(arg: list[int]): + pass + +def func2() -> list[int]: + pass + +Alias2 = Union[list[str], None] # [unsubscriptable-object] +Alias3 = Union[Union[list[int], int]] # [unsubscriptable-object] +Alias4 = Tuple[list[int]] # [unsubscriptable-object] +Alias5 = Dict[str, list[int]] # [unsubscriptable-object] +Alias6 = int | list[int] # [unsubscriptable-object] +Alias7 = list[list[int]] # [unsubscriptable-object,unsubscriptable-object] + + +import collections.abc +import contextlib +import re + +class OrderedDict: + pass + +var12: OrderedDict[str, int] # string annotations aren't checked +var13: list[int] +var14: collections.OrderedDict[str, int] +var15: collections.Counter[int] +var16: collections.abc.Iterable[int] +var17: contextlib.AbstractContextManager[int] +var18: re.Pattern[str] + + +def func3(): + AliasInvalid2 = list[int] # [unsubscriptable-object] + cast_variable2 = [1, 2, 3] + cast_variable2 = typing.cast(list[int], cast_variable2) # [unsubscriptable-object] + var19: list[int] + +def func4(arg=list[int]): # [unsubscriptable-object] + pass + +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/postponed_evaluation_pep585.rc b/tests/functional/p/postponed/postponed_evaluation_pep585.rc new file mode 100644 index 000000000..35b185fdb --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_pep585.rc @@ -0,0 +1,3 @@ +[testoptions] +min_pyver=3.8 +max_pyver=3.9 diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585.txt b/tests/functional/p/postponed/postponed_evaluation_pep585.txt new file mode 100644 index 000000000..899dc5977 --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_pep585.txt @@ -0,0 +1,19 @@ +unsubscriptable-object:23:15:23:19::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:28:25:28:29:CustomIntListError:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:32:28:32:32::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:34:24:34:28::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:36:14:36:18::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:41:36:41:40::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:51:54:51:58::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:53:60:53:64::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:104:15:104:19::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:105:21:105:25::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:106:15:106:19::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:107:19:107:23::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:108:15:108:19::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:109:9:109:13::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:109:14:109:18::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:129:20:129:24:func3:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:131:33:131:37:func3:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:134:14:134:18:func4:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:137:32:137:35:func5:Value 'set' is unsubscriptable:UNDEFINED diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_error.py b/tests/functional/p/postponed/postponed_evaluation_pep585_error.py new file mode 100644 index 000000000..9810c0c14 --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_pep585_error.py @@ -0,0 +1,124 @@ +"""Test PEP 585 without postponed evaluation. Everything should fail. + +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 +# pylint: disable=invalid-name,inherit-non-class,unsupported-binary-operation +# pylint: disable=unused-variable,line-too-long,unnecessary-direct-lambda-call + +# Disabled because of a bug with pypy 3.8 see +# https://github.com/pylint-dev/pylint/pull/7918#issuecomment-1352737369 +# pylint: disable=multiple-statements + +import collections +import dataclasses +import typing +from dataclasses import dataclass +from typing import Any, Dict, NamedTuple, TypedDict, Union + + +AliasInvalid = list[int] # [unsubscriptable-object] + +class CustomIntList(typing.List[int]): + pass + +class CustomIntListError(list[int]): # [unsubscriptable-object] + pass + +cast_variable = [1, 2, 3] +cast_variable = typing.cast(list[int], cast_variable) # [unsubscriptable-object] + +T = typing.TypeVar("T", list[int], str) # [unsubscriptable-object] + +(lambda x: 2)(list[int]) # [unsubscriptable-object] + + +# Check typing.NamedTuple +CustomNamedTuple = typing.NamedTuple( + "CustomNamedTuple", [("my_var", list[int])]) # [unsubscriptable-object] + +class CustomNamedTuple2(NamedTuple): + my_var: list[int] # [unsubscriptable-object] + +class CustomNamedTuple3(typing.NamedTuple): + my_var: list[int] # [unsubscriptable-object] + + +# Check typing.TypedDict +CustomTypedDict = TypedDict("CustomTypedDict", my_var=list[int]) # [unsubscriptable-object] + +CustomTypedDict2 = TypedDict("CustomTypedDict2", {"my_var": list[int]}) # [unsubscriptable-object] + +class CustomTypedDict3(TypedDict): + my_var: list[int] # [unsubscriptable-object] + +class CustomTypedDict4(typing.TypedDict): + my_var: list[int] # [unsubscriptable-object] + + +# Check dataclasses +def my_decorator(*args, **kwargs): + def wraps(*args, **kwargs): + pass + return wraps + +@dataclass +class CustomDataClass: + my_var: list[int] # [unsubscriptable-object] + +@dataclasses.dataclass +class CustomDataClass2: + my_var: list[int] # [unsubscriptable-object] + +@dataclass() +class CustomDataClass3: + my_var: list[int] # [unsubscriptable-object] + +@my_decorator +@dataclasses.dataclass +class CustomDataClass4: + my_var: list[int] # [unsubscriptable-object] + + +var1: set[int] # [unsubscriptable-object] +var2: collections.OrderedDict[str, int] # [unsubscriptable-object] +var3: dict[str, list[int]] # [unsubscriptable-object,unsubscriptable-object] +var4: Dict[str, list[int]] # [unsubscriptable-object] +var5: dict[tuple[int, int], str] # [unsubscriptable-object,unsubscriptable-object] +var6: Dict[tuple[int, int], str] # [unsubscriptable-object] +var7: list[list[int]] # [unsubscriptable-object,unsubscriptable-object] +var8: tuple[list[int]] # [unsubscriptable-object,unsubscriptable-object] +var9: int | list[str | int] # [unsubscriptable-object] +var10: Union[list[str], None] # [unsubscriptable-object] +var11: Union[Union[list[int], int]] # [unsubscriptable-object] + +def func(arg: list[int]): # [unsubscriptable-object] + pass + +def func2() -> list[int]: # [unsubscriptable-object] + pass + +Alias2 = Union[list[str], None] # [unsubscriptable-object] +Alias3 = Union[Union[list[int], int]] # [unsubscriptable-object] +Alias5 = Dict[str, list[int]] # [unsubscriptable-object] +Alias6 = int | list[int] # [unsubscriptable-object] +Alias7 = list[list[int]] # [unsubscriptable-object,unsubscriptable-object] + + +def func3(): + AliasInvalid2 = list[int] # [unsubscriptable-object] + cast_variable2 = [1, 2, 3] + cast_variable2 = typing.cast(list[int], cast_variable2) # [unsubscriptable-object] + var12: list[int] # [unsubscriptable-object] + +def func4(var=list[int]): # [unsubscriptable-object] + pass + +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/postponed_evaluation_pep585_error.rc b/tests/functional/p/postponed/postponed_evaluation_pep585_error.rc new file mode 100644 index 000000000..35b185fdb --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_pep585_error.rc @@ -0,0 +1,3 @@ +[testoptions] +min_pyver=3.8 +max_pyver=3.9 diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_error.txt b/tests/functional/p/postponed/postponed_evaluation_pep585_error.txt new file mode 100644 index 000000000..406081dfa --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_pep585_error.txt @@ -0,0 +1,49 @@ +unsubscriptable-object:22:15:22:19::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:27:25:27:29:CustomIntListError:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:31:28:31:32::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:33:24:33:28::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:35:14:35:18::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:40:36:40:40::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:43:12:43:16:CustomNamedTuple2:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:46:12:46:16:CustomNamedTuple3:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:50:54:50:58::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:52:60:52:64::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:55:12:55:16:CustomTypedDict3:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:58:12:58:16:CustomTypedDict4:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:69:12:69:16:CustomDataClass:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:73:12:73:16:CustomDataClass2:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:77:12:77:16:CustomDataClass3:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:82:12:82:16:CustomDataClass4:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:85:6:85:9::Value 'set' is unsubscriptable:UNDEFINED +unsubscriptable-object:86:6:86:29::Value 'collections.OrderedDict' is unsubscriptable:UNDEFINED +unsubscriptable-object:87:6:87:10::Value 'dict' is unsubscriptable:UNDEFINED +unsubscriptable-object:87:16:87:20::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:88:16:88:20::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:89:6:89:10::Value 'dict' is unsubscriptable:UNDEFINED +unsubscriptable-object:89:11:89:16::Value 'tuple' is unsubscriptable:UNDEFINED +unsubscriptable-object:90:11:90:16::Value 'tuple' is unsubscriptable:UNDEFINED +unsubscriptable-object:91:6:91:10::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:91:11:91:15::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:92:12:92:16::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:92:6:92:11::Value 'tuple' is unsubscriptable:UNDEFINED +unsubscriptable-object:93:12:93:16::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:94:13:94:17::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:95:19:95:23::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:97:14:97:18:func:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:100:15:100:19:func2:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:103:15:103:19::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:104:21:104:25::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:105:19:105:23::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:106:15:106:19::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:107:9:107:13::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:107:14:107:18::Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:111:20:111:24:func3:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:113:33:113:37:func3:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:114:11:114:15:func3:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:116:14:116:18:func4:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:119:16:119:20:func5:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:119:32:119:35:func5:Value 'set' is unsubscriptable:UNDEFINED +unsubscriptable-object:122:75:122:79:func6:Value 'dict' is unsubscriptable:UNDEFINED +unsubscriptable-object:122:16:122:20:func6:Value 'list' is unsubscriptable:UNDEFINED +unsubscriptable-object:122:55:122:58:func6:Value 'set' is unsubscriptable:UNDEFINED +unsubscriptable-object:122:37:122:42:func6:Value 'tuple' is unsubscriptable:UNDEFINED diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_py39.py b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.py new file mode 100644 index 000000000..5354e081f --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.py @@ -0,0 +1,128 @@ +"""Test PEP 585 works as expected, starting with Python 3.9""" +# pylint: disable=missing-docstring,unused-argument,unused-import,too-few-public-methods,invalid-name,inherit-non-class,unsupported-binary-operation,wrong-import-position,ungrouped-imports,unused-variable,unnecessary-direct-lambda-call +import collections +import dataclasses +import typing +from dataclasses import dataclass +from typing import Any, Dict, NamedTuple, TypedDict, Union, Tuple + + +AliasValid = list[int] + +class CustomIntList(typing.List[int]): + pass + +class CustomIntListError(list[int]): + pass + +cast_variable = [1, 2, 3] +cast_variable = typing.cast(list[int], cast_variable) + +T = typing.TypeVar("T", list[int], str) + +(lambda x: 2)(list[int]) + + +# Check typing.NamedTuple +CustomNamedTuple = typing.NamedTuple( + "CustomNamedTuple", [("my_var", list[int])]) + +class CustomNamedTuple2(NamedTuple): + my_var: list[int] + +class CustomNamedTuple3(typing.NamedTuple): + my_var: list[int] + + +# Check typing.TypedDict +CustomTypedDict = TypedDict("CustomTypedDict", my_var=list[int]) + +CustomTypedDict2 = TypedDict("CustomTypedDict2", {"my_var": list[int]}) + +class CustomTypedDict3(TypedDict): + my_var: list[int] + +class CustomTypedDict4(typing.TypedDict): + my_var: list[int] + + +# Check dataclasses +def my_decorator(*args, **kwargs): + def wraps(*args, **kwargs): + pass + return wraps + +@dataclass +class CustomDataClass: + my_var: list[int] + +@dataclasses.dataclass +class CustomDataClass2: + my_var: list[int] + +@dataclass() +class CustomDataClass3: + my_var: list[int] + +@my_decorator +@dataclasses.dataclass +class CustomDataClass4: + my_var: list[int] + + +var1: set[int] +var2: collections.OrderedDict[str, int] +var3: dict[str, list[int]] +var4: Dict[str, list[int]] +var5: dict[tuple[int, int], str] +var6: Dict[tuple[int, int], str] +var7: list[list[int]] +var8: tuple[list[int]] +var9: int | list[str | int] +var10: Union[list[str], None] +var11: Union[Union[list[int], int]] + +def func(arg: list[int]): + pass + +def func2() -> list[int]: + pass + +Alias2 = Union[list[str], None] +Alias3 = Union[Union[list[int], int]] +Alias4 = Tuple[list[int]] +Alias5 = Dict[str, list[int]] +Alias6 = int | list[int] +Alias7 = list[list[int]] + + +import collections.abc +import contextlib +import re + +class OrderedDict: + pass + +var12: OrderedDict[str, int] # [unsubscriptable-object] +var13: list[int] +var14: collections.OrderedDict[str, int] +var15: collections.Counter[int] +var16: collections.abc.Iterable[int] +var17: contextlib.AbstractContextManager[int] +var18: re.Pattern[str] + + +def func3(): + AliasInvalid2 = list[int] + cast_variable2 = [1, 2, 3] + cast_variable2 = typing.cast(list[int], cast_variable2) + var19: list[int] + +def func4(var=list[int]): + pass + +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 diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_py39.rc b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.rc new file mode 100644 index 000000000..16b75eea7 --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.rc @@ -0,0 +1,2 @@ +[testoptions] +min_pyver=3.9 diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_py39.txt b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.txt new file mode 100644 index 000000000..127e252a5 --- /dev/null +++ b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.txt @@ -0,0 +1 @@ +unsubscriptable-object:106:7:106:18::Value 'OrderedDict' is unsubscriptable:UNDEFINED |