-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add typecheck tests for dataclass attributes
- Loading branch information
1 parent
077a034
commit 2d05a4e
Showing
3 changed files
with
129 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
"""Tests for dataclass attributes with basic type annotations. | ||
Tests for regressions from https://github.com/PyCQA/astroid/pull/1126 | ||
""" | ||
# pylint: disable=missing-docstring,too-few-public-methods,pointless-statement,redefined-builtin, fixme | ||
from dataclasses import dataclass | ||
from typing import Callable, Dict, List, Optional | ||
|
||
|
||
class Dummy: | ||
pass | ||
|
||
|
||
@dataclass | ||
class MyClass: | ||
# Attribute inference does not support Optional, so Uninferable is yielded | ||
# This should not trigger any type errors from pylint | ||
attr0: Optional[Dummy] | ||
|
||
attr1: int | ||
attr2: str | ||
attr3: Callable[[int], int] | ||
attr4: List[int] | ||
attr5: Dict[str, str] | ||
|
||
|
||
obj = MyClass(None, 1, 'hi', lambda x: x, [], {}) | ||
|
||
lst = [0, 1, 2] | ||
print(lst[obj.attr0]) | ||
print(lst[obj.attr1]) | ||
print(lst[obj.attr2]) # [invalid-sequence-index] | ||
|
||
print(lst[obj.attr0::]) | ||
print(lst[obj.attr1::]) | ||
print(lst[obj.attr2::]) # [invalid-slice-index] | ||
|
||
obj.attr0(100) | ||
obj.attr1(100) # [not-callable] | ||
obj.attr3(100) | ||
|
||
print(-obj.attr0) | ||
print(-obj.attr1) | ||
print(-obj.attr2) # [invalid-unary-operand-type] | ||
|
||
print(1 + obj.attr0) | ||
print(1 + obj.attr1) | ||
print(1 + obj.attr2) # Should be an error here once unsupported-binary-operation is enabled | ||
|
||
print(1 in obj.attr0) | ||
print(1 in obj.attr1) # [unsupported-membership-test] | ||
print(1 in obj.attr4) | ||
print('hi' in obj.attr5) | ||
|
||
print(obj.attr0[1]) | ||
print(obj.attr1[1]) # [unsubscriptable-object] | ||
print(obj.attr4[1]) | ||
print(obj.attr5['hi']) | ||
|
||
obj.attr0[1] = 1 | ||
obj.attr1[1] = 1 # [unsupported-assignment-operation] | ||
obj.attr4[1] = 1 | ||
obj.attr5['hi'] = 'bye' | ||
|
||
del obj.attr0[1] | ||
del obj.attr1[1] # [unsupported-delete-operation] | ||
del obj.attr4[1] | ||
del obj.attr5['hi'] | ||
|
||
|
||
class Manager: | ||
def __enter__(self): | ||
pass | ||
|
||
def __exit__(self, type_, value, traceback): | ||
pass | ||
|
||
|
||
@dataclass | ||
class MyClass2: | ||
attr0: Optional[Dummy] | ||
attr1: Manager | ||
attr2: str | ||
|
||
|
||
obj2 = MyClass2(None, Manager(), 'hi') | ||
with obj2.attr0: | ||
pass | ||
with obj2.attr1: | ||
pass | ||
with obj2.attr2: # [not-context-manager] | ||
pass | ||
|
||
|
||
class Test1(metaclass=obj.attr0): | ||
pass | ||
|
||
|
||
class Test2(metaclass=obj.attr1): # [invalid-metaclass] | ||
pass | ||
|
||
|
||
{}[obj.attr0] = 1 | ||
{}[obj.attr1] = 1 | ||
{}[obj.attr5] = 1 # [unhashable-dict-key] | ||
|
||
for k, v in obj.attr5: # TODO: Should be an dict-iter-missing-items error | ||
print(k, v) | ||
|
||
__name__ = obj.attr0 | ||
__name__ = obj.attr1 # TODO: Should be a non-str-assignment-to-dunder-name error | ||
__name__ = obj.attr2 | ||
|
||
print(isinstance(1, obj.attr0)) | ||
print(isinstance(1, obj.attr1)) # [isinstance-second-argument-not-valid-type] |
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,2 @@ | ||
[testoptions] | ||
min_pyver=3.7 |
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,12 @@ | ||
invalid-sequence-index:32:6::Sequence index is not an int, slice, or instance with __index__:HIGH | ||
invalid-slice-index:36:0::Slice index is not an int, None, or instance with __index__:HIGH | ||
not-callable:39:0::obj.attr1 is not callable:HIGH | ||
invalid-unary-operand-type:44:6::"bad operand type for unary -: str":HIGH | ||
unsupported-membership-test:51:11::Value 'obj.attr1' doesn't support membership test:HIGH | ||
unsubscriptable-object:56:6::Value 'obj.attr1' is unsubscriptable:HIGH | ||
unsupported-assignment-operation:61:0::'obj.attr1' does not support item assignment:HIGH | ||
unsupported-delete-operation:66:4::'obj.attr1' does not support item deletion:HIGH | ||
not-context-manager:91:0::Context manager 'str' doesn't implement __enter__ and __exit__.:HIGH | ||
invalid-metaclass:99:0:Test2:Invalid metaclass 'Instance of builtins.int' used:HIGH | ||
unhashable-dict-key:105:0::Dict key is unhashable:HIGH | ||
isinstance-second-argument-not-valid-type:115:6::Second argument of isinstance is not a type:HIGH |