Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 2 additions & 14 deletions conformance/results/mypy/dataclasses_descriptors.toml
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
conformant = "Partial"
notes = """
Assumes descriptor behavior only when field is assigned in class body.
Does not correctly evaluate type of descriptor access.
"""
conformant = "Pass"
output = """
dataclasses_descriptors.py:61: error: Cannot access instance-only attribute "x" on class object [misc]
dataclasses_descriptors.py:62: error: Cannot access instance-only attribute "y" on class object [misc]
dataclasses_descriptors.py:66: error: Expression is of type "Desc2[int]", not "int" [assert-type]
dataclasses_descriptors.py:67: error: Expression is of type "Desc2[str]", not "str" [assert-type]
"""
conformance_automated = "Fail"
conformance_automated = "Pass"
errors_diff = """
Line 61: Unexpected errors ['dataclasses_descriptors.py:61: error: Cannot access instance-only attribute "x" on class object [misc]']
Line 62: Unexpected errors ['dataclasses_descriptors.py:62: error: Cannot access instance-only attribute "y" on class object [misc]']
Line 66: Unexpected errors ['dataclasses_descriptors.py:66: error: Expression is of type "Desc2[int]", not "int" [assert-type]']
Line 67: Unexpected errors ['dataclasses_descriptors.py:67: error: Expression is of type "Desc2[str]", not "str" [assert-type]']
"""
21 changes: 2 additions & 19 deletions conformance/results/pycroscope/dataclasses_descriptors.toml
Original file line number Diff line number Diff line change
@@ -1,23 +1,6 @@
conformant = "Partial"
notes = """
Conformance suite is questionable; see <https://github.com/python/typing/issues/2259>
"""
conformance_automated = "Fail"
conformant = "Pass"
conformance_automated = "Pass"
errors_diff = """
Line 61: Unexpected errors ['./dataclasses_descriptors.py:61:12: Any[error] is not equivalent to list[int]', "./dataclasses_descriptors.py:61:12: <class 'DC2'> has no attribute 'x' [undefined_attribute]"]
Line 62: Unexpected errors ['./dataclasses_descriptors.py:62:12: Any[error] is not equivalent to list[str]', "./dataclasses_descriptors.py:62:12: <class 'DC2'> has no attribute 'y' [undefined_attribute]"]
Line 63: Unexpected errors ['./dataclasses_descriptors.py:63:12: list[Any[generic_argument]] is not equivalent to list[str]']
Line 66: Unexpected errors ['./dataclasses_descriptors.py:66:12: ./dataclasses_descriptors.py.Desc2[int] is not equivalent to int']
Line 67: Unexpected errors ['./dataclasses_descriptors.py:67:12: ./dataclasses_descriptors.py.Desc2[str] is not equivalent to str']
Line 68: Unexpected errors ['./dataclasses_descriptors.py:68:12: Any[generic_argument] is not equivalent to str']
"""
output = """
./dataclasses_descriptors.py:61:12: Any[error] is not equivalent to list[int]
./dataclasses_descriptors.py:61:12: <class 'DC2'> has no attribute 'x' [undefined_attribute]
./dataclasses_descriptors.py:62:12: Any[error] is not equivalent to list[str]
./dataclasses_descriptors.py:62:12: <class 'DC2'> has no attribute 'y' [undefined_attribute]
./dataclasses_descriptors.py:63:12: list[Any[generic_argument]] is not equivalent to list[str]
./dataclasses_descriptors.py:66:12: ./dataclasses_descriptors.py.Desc2[int] is not equivalent to int
./dataclasses_descriptors.py:67:12: ./dataclasses_descriptors.py.Desc2[str] is not equivalent to str
./dataclasses_descriptors.py:68:12: Any[generic_argument] is not equivalent to str
"""
6 changes: 2 additions & 4 deletions conformance/results/pyrefly/dataclasses_descriptors.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@ Doesn't allow non-data descriptors or data descriptors with differing `__get__`
"""
conformance_automated = "Fail"
errors_diff = """
Line 32: Unexpected errors ['Cannot set field `y` to data descriptor `Desc1` with inconsistent types [bad-class-definition]']
Line 58: Unexpected errors ['Cannot set field `z` to non-data descriptor `Desc2` [bad-class-definition]']
Line 30: Unexpected errors ['Cannot set field `y` to data descriptor `Desc1` with inconsistent types [bad-class-definition]']
"""
output = """
ERROR dataclasses_descriptors.py:32:5-6: Cannot set field `y` to data descriptor `Desc1` with inconsistent types [bad-class-definition]
ERROR dataclasses_descriptors.py:58:5-6: Cannot set field `z` to non-data descriptor `Desc2` [bad-class-definition]
ERROR dataclasses_descriptors.py:30:5-6: Cannot set field `y` to data descriptor `Desc1` with inconsistent types [bad-class-definition]
"""
34 changes: 9 additions & 25 deletions conformance/results/results.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 2 additions & 9 deletions conformance/results/ty/dataclasses_descriptors.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
conformance_automated = "Fail"
conformant = "Partial"
notes = """
Only infers a descriptor `__get__` method as being called when a descriptor attribute is accessed on an instance if the descriptor attribute is present in the class namespace.
"""
conformance_automated = "Pass"
conformant = "Pass"
errors_diff = """
Line 66: Unexpected errors ['dataclasses_descriptors.py:66:1: error[type-assertion-failure] Type `int | Desc2[int]` does not match asserted type `int`']
Line 67: Unexpected errors ['dataclasses_descriptors.py:67:1: error[type-assertion-failure] Type `str | Desc2[str]` does not match asserted type `str`']
"""
output = """
dataclasses_descriptors.py:66:1: error[type-assertion-failure] Type `int | Desc2[int]` does not match asserted type `int`
dataclasses_descriptors.py:67:1: error[type-assertion-failure] Type `str | Desc2[str]` does not match asserted type `str`
"""
38 changes: 6 additions & 32 deletions conformance/tests/dataclasses_descriptors.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
# but its behavior can be determined from the runtime implementation.

from dataclasses import dataclass
from typing import Any, Generic, TypeVar, assert_type, overload

T = TypeVar("T")
from typing import Any, assert_type, overload


class Desc1:
Expand Down Expand Up @@ -37,32 +35,8 @@ class DC1:
assert_type(dc1.y, int)
assert_type(DC1.y, Desc1)


class Desc2(Generic[T]):
@overload
def __get__(self, instance: None, owner: Any) -> list[T]:
...

@overload
def __get__(self, instance: object, owner: Any) -> T:
...

def __get__(self, instance: object | None, owner: Any) -> list[T] | T:
raise NotImplementedError


@dataclass
class DC2:
x: Desc2[int]
y: Desc2[str]
z: Desc2[str] = Desc2()


assert_type(DC2.x, list[int])
assert_type(DC2.y, list[str])
assert_type(DC2.z, list[str])

dc2 = DC2(Desc2(), Desc2(), Desc2())
assert_type(dc2.x, int)
assert_type(dc2.y, str)
assert_type(dc2.z, str)
# Note: a previous version of this test also covered non-data descriptors
# (objects implementing only __get__, no __set__) used as dataclass fields.
# That case was removed because the assertions did not match actual runtime
# behavior; see https://github.com/python/typing/issues/2259. The correct
# behavior for non-data descriptors in dataclasses is not yet specified.