python / python/typing

Conformance suite: Questionable tests in dataclasses_descriptors.py

オープン
#2,259 コメント 1 件 リアクション 5 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

topic: conformance tests topic: other
主要言語
Python
スター
1.8k
フォーク
302
平均マージ
23時間
マージ済み PR(30日)
8

説明

The dataclasses_descriptors.py test case has a comment "This portion of the dataclass spec is under-specified in the documentation, but its behavior can be determined from the runtime implementation."
However, some of the behaviors in tests don't align with the runtime behavior.

The first part, which is using a data descriptor Desc1 and a dataclass DC1, is fine.

Then we get this, where Desc2 is a non-data descriptor (only implementing __get__):

@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])

However, DC2.x and DC2.y are AttributeErrors at runtime, because there is no Desc2 object in the runtime class dictionary. I don't know if we should require type checkers to produce an error but certainly we should allow it.

Then we construct a DC2 object:


dc2 = DC2(Desc2(), Desc2(), Desc2())
assert_type(dc2.x, int)
assert_type(dc2.y, str)
assert_type(dc2.z, str)

But at runtime, dc2's three attributes are all just those Desc2 objects, not ints or strs, because those objects are stored as instance attributes, so the descriptor protocol never runs on them.

The more complicated case is the z attribute, which has a Desc2 object stored in the class. Dataclasses would conventionally treat this as the default, but it gets the default by conventional access in the class body, which calls the descriptor's __get__ with obj=None. So the runtime default for this field is actually the value you'd get for accessing DC2.z, which is list[str].

Looking at actual type checker behavior, I think pyrefly gets all this pretty much right (which means it fails the test). Mypy and pyright pass the test, but their behavior is wrong.

Since (as the test acknowledges) the behavior is not fully specified, perhaps it is best to delete this test from the conformance suite for now, until we come up with a full specification for the behavior of descriptors in dataclasses.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

conformance/tests/dataclasses_descriptors.py を読み、issue で説明されている Desc2 と DC2 のケースに重点を置いてください。アサートされた型を、実行時の挙動および pyrefly、mypy、pyright の異なる結果と照らし合わせて確認してください。完了とは、conformance suite が、実行時の挙動によって仕様化もサポートもされていない挙動をもはや要求せず、提案されたテストの削除がプロジェクトのメンテナーによって解決されていることを意味します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
testing-qa
issue の種類
バグ
難易度
2/5
見積もり時間
1〜3時間
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
48/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。