1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
"""Tests for used-before-assignment for typing related issues"""
# pylint: disable=missing-function-docstring
from typing import List, Optional
class MyClass:
"""Type annotation or default values for first level methods can't refer to their own class"""
def incorrect_typing_method(
self, other: MyClass # [used-before-assignment]
) -> bool:
return self == other
def incorrect_nested_typing_method(
self, other: List[MyClass] # [used-before-assignment]
) -> bool:
return self == other[0]
def incorrect_default_method(
self, other=MyClass() # [used-before-assignment]
) -> bool:
return self == other
def correct_string_typing_method(self, other: "MyClass") -> bool:
return self == other
def correct_inner_typing_method(self) -> bool:
def inner_method(self, other: MyClass) -> bool:
return self == other
return inner_method(self, MyClass())
class MySecondClass:
"""Class to test self referential variable typing.
This regressed, reported in: https://github.com/PyCQA/pylint/issues/5342
"""
def self_referential_optional_within_method(self) -> None:
variable: Optional[MySecondClass] = self
print(variable)
def correct_inner_typing_method(self) -> bool:
def inner_method(self, other: MySecondClass) -> bool:
return self == other
return inner_method(self, MySecondClass())
class MyOtherClass:
"""Class to test self referential variable typing, no regression."""
def correct_inner_typing_method(self) -> bool:
def inner_method(self, other: MyOtherClass) -> bool:
return self == other
return inner_method(self, MyOtherClass())
def self_referential_optional_within_method(self) -> None:
variable: Optional[MyOtherClass] = self
print(variable)
class MyThirdClass:
"""Class to test self referential variable typing within conditionals.
This regressed, reported in: https://github.com/PyCQA/pylint/issues/5499
"""
def function(self, var: int) -> None:
if var < 0.5:
_x: MyThirdClass = self
def other_function(self) -> None:
_x: MyThirdClass = self
|