diff --git a/conformance/results/mypy/dataclasses_descriptors.toml b/conformance/results/mypy/dataclasses_descriptors.toml index e47310293..5e485e856 100644 --- a/conformance/results/mypy/dataclasses_descriptors.toml +++ b/conformance/results/mypy/dataclasses_descriptors.toml @@ -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]'] """ diff --git a/conformance/results/pycroscope/dataclasses_descriptors.toml b/conformance/results/pycroscope/dataclasses_descriptors.toml index 5b89c7ef9..be211bd5b 100644 --- a/conformance/results/pycroscope/dataclasses_descriptors.toml +++ b/conformance/results/pycroscope/dataclasses_descriptors.toml @@ -1,23 +1,6 @@ -conformant = "Partial" -notes = """ -Conformance suite is questionable; see -""" -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: 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: 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: has no attribute 'x' [undefined_attribute] -./dataclasses_descriptors.py:62:12: Any[error] is not equivalent to list[str] -./dataclasses_descriptors.py:62:12: 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 """ diff --git a/conformance/results/pyrefly/dataclasses_descriptors.toml b/conformance/results/pyrefly/dataclasses_descriptors.toml index 5f36bae96..404871e0f 100644 --- a/conformance/results/pyrefly/dataclasses_descriptors.toml +++ b/conformance/results/pyrefly/dataclasses_descriptors.toml @@ -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] """ diff --git a/conformance/results/results.html b/conformance/results/results.html index aa2fa2891..faebab2ac 100644 --- a/conformance/results/results.html +++ b/conformance/results/results.html @@ -1883,19 +1883,8 @@

Python Type System Conformance Test Results

dataclasses_descriptors Pass - - Partial -
    -
  • Assumes descriptor behavior only when field is assigned in class body.
  • -
  • Does not correctly evaluate type of descriptor access.
  • -
- - - Partial - - + Pass + Pass Partial
    @@ -1904,12 +1893,7 @@

    Python Type System Conformance Test Results

Pass - - Partial -
    -
  • 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.
  • -
- + Pass Pass @@ -2114,11 +2098,11 @@

Python Type System Conformance Test Results

16 / 16 • 100.0% - 11.5 / 16 • 71.9% - 15.5 / 16 • 96.9% + 12 / 16 • 75.0% + 16 / 16 • 100.0% 15.5 / 16 • 96.9% 16 / 16 • 100.0% - 14.5 / 16 • 90.6% + 15 / 16 • 93.8% 16 / 16 • 100.0% @@ -2807,11 +2791,11 @@

Python Type System Conformance Test Results

141 / 141 • 100.0% - 109 / 141 • 77.3% - 130 / 141 • 92.2% + 109.5 / 141 • 77.7% + 130.5 / 141 • 92.6% 138 / 141 • 97.9% 136.5 / 141 • 96.8% - 116 / 141 • 82.3% + 116.5 / 141 • 82.6% 140.5 / 141 • 99.6% diff --git a/conformance/results/ty/dataclasses_descriptors.toml b/conformance/results/ty/dataclasses_descriptors.toml index 91ad20b90..32a11cf91 100644 --- a/conformance/results/ty/dataclasses_descriptors.toml +++ b/conformance/results/ty/dataclasses_descriptors.toml @@ -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` """ diff --git a/conformance/tests/dataclasses_descriptors.py b/conformance/tests/dataclasses_descriptors.py index f2f30a623..2d0880b92 100644 --- a/conformance/tests/dataclasses_descriptors.py +++ b/conformance/tests/dataclasses_descriptors.py @@ -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: @@ -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.