-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
…le` when accessing unused type annotations (#5718) * Add confidence level HIGH to `used-before-assignment`
- Loading branch information
1 parent
f85fb8d
commit 0fb6a12
Showing
7 changed files
with
113 additions
and
90 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
90 changes: 90 additions & 0 deletions
90
tests/functional/u/use/used_before_assignment_type_annotations.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
"""Tests for annotation of variables and potential use before assignment""" | ||
# pylint: disable=too-few-public-methods, global-variable-not-assigned | ||
from collections import namedtuple | ||
from typing import List | ||
|
||
def value_and_type_assignment(): | ||
"""The variable assigned a value and type""" | ||
variable: int = 2 | ||
print(variable) | ||
|
||
|
||
def only_type_assignment(): | ||
"""The variable never gets assigned a value""" | ||
variable: int | ||
print(variable) # [used-before-assignment] | ||
|
||
|
||
def both_type_and_value_assignment(): | ||
"""The variable first gets a type and subsequently a value""" | ||
variable: int | ||
variable = 1 | ||
print(variable) | ||
|
||
|
||
def value_assignment_after_access(): | ||
"""The variable gets a value after it has been accessed""" | ||
variable: int | ||
print(variable) # [used-before-assignment] | ||
variable = 1 | ||
|
||
|
||
def value_assignment_from_iterator(): | ||
"""The variables gets a value from an iterator""" | ||
variable: int | ||
for variable in (1, 2): | ||
print(variable) | ||
|
||
|
||
def assignment_in_comprehension(): | ||
"""A previously typed variables gets used in a comprehension. Don't crash!""" | ||
some_list: List[int] | ||
some_list = [1, 2, 3] | ||
some_list = [i * 2 for i in some_list] | ||
|
||
|
||
def decorator_returning_function(): | ||
"""A decorator that returns a wrapper function with decoupled typing""" | ||
def wrapper_with_decoupled_typing(): | ||
print(var) | ||
|
||
var: int | ||
var = 2 | ||
return wrapper_with_decoupled_typing | ||
|
||
|
||
def decorator_returning_incorrect_function(): | ||
"""A decorator that returns a wrapper function with decoupled typing""" | ||
def wrapper_with_type_and_no_value(): | ||
# This emits NameError rather than UnboundLocalError, so | ||
# undefined-variable is okay, even though the traceback refers | ||
# to "free variable 'var' referenced before assignment" | ||
print(var) # [undefined-variable] | ||
|
||
var: int | ||
return wrapper_with_type_and_no_value | ||
|
||
|
||
def typing_and_value_assignment_with_tuple_assignment(): | ||
"""The typed variables get assigned with a tuple assignment""" | ||
var_one: int | ||
var_two: int | ||
var_one, var_two = 1, 1 | ||
print(var_one) | ||
print(var_two) | ||
|
||
|
||
def nested_class_as_return_annotation(): | ||
"""A namedtuple as a class attribute is used as a return annotation | ||
Taken from https://github.com/PyCQA/pylint/issues/5568""" | ||
class MyObject: | ||
"""namedtuple as class attribute""" | ||
Coords = namedtuple('Point', ['x', 'y']) | ||
|
||
def my_method(self) -> Coords: | ||
"""Return annotation is valid""" | ||
# pylint: disable=unnecessary-pass | ||
pass | ||
|
||
print(MyObject) |
3 changes: 3 additions & 0 deletions
3
tests/functional/u/use/used_before_assignment_type_annotations.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
used-before-assignment:15:10:15:18:only_type_assignment:Using variable 'variable' before assignment:HIGH | ||
used-before-assignment:28:10:28:18:value_assignment_after_access:Using variable 'variable' before assignment:HIGH | ||
undefined-variable:62:14:62:17:decorator_returning_incorrect_function.wrapper_with_type_and_no_value:Undefined variable 'var':HIGH |