From e51004d9f32f1c5d568e5a4dc56f5e7fcf77955b Mon Sep 17 00:00:00 2001 From: ashishpatel26 Date: Fri, 10 Jul 2026 12:49:34 +0530 Subject: [PATCH] Conformance: remove non-data-descriptor tests in dataclasses_descriptors.py The Desc2/DC2 test case asserted that dataclass fields typed with a non-data descriptor (a class implementing only __get__, no __set__) resolve through the descriptor protocol. That assertion doesn't match runtime behavior: such fields are stored as plain instance attributes, so the descriptor's __get__ never runs on instance access. The correct behavior for non-data descriptors in dataclasses is underspecified, so remove the incorrect assertions until the spec covers this case. The Desc1 (data descriptor) test, which is correct and confirmed against runtime, is unaffected. Fixes #2259 --- .../results/mypy/dataclasses_descriptors.toml | 16 +------- .../pycroscope/dataclasses_descriptors.toml | 21 +--------- .../pyrefly/dataclasses_descriptors.toml | 6 +-- conformance/results/results.html | 34 +++++------------ .../results/ty/dataclasses_descriptors.toml | 11 +----- conformance/tests/dataclasses_descriptors.py | 38 +++---------------- 6 files changed, 23 insertions(+), 103 deletions(-) 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.