python / python/cpython

Incorrect tests for get_type_hints()

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

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

stdlib topic-typing type-bug
主要言語
Python
スター
77.2k
フォーク
36k
PR マージ指標
PR 指標を取得中

説明

Bug report

Bug description:

A few tests for typing.get_type_hints() test behavior that I feel is incorrect. Fixing it may be more trouble than it's worth, but I thought I'd record these.

  1. test_get_type_hints_generic

https://github.com/python/cpython/blob/5236b0281b91a874b14cf15f3fdef9b7beffb22f/Lib/test/test_typing.py#L8765

This tests that the a key for the TypedDict is T | None, where T is the TypeVar of that name defined in test_typing.py. However, the relevant TypedDict field is defined in a separate module _typed_dict_helper that has its own T TypeVar. get_type_hints() should pick up the T from the helper module, not the one from test_typing.

This also affects another assertion in the same function.

  1. test_get_type_hints_classes

https://github.com/python/cpython/blob/5236b0281b91a874b14cf15f3fdef9b7beffb22f/Lib/test/test_typing.py#L6636

This calls get_type_hints() on a class defined like this:

class B(Generic[T]):
    class A(Generic[T]):
        pass

    my_inner_a1: 'B.A'
    my_inner_a2: A
    my_outer_a: 'A'  # unless somebody calls get_type_hints with localns=B.__dict__

It checks that the unquoted A refers to the nested class and the quoted A refers to a different A class in the outer scope. But the fact that the name was quoted shouldn't influence scoping logic; it should resolve to the same name whether or not it's quoted.


I have a change that fixes both of these tests, but I'm not convinced we can afford to change this.

CPython versions tested on:

CPython main branch

Operating systems tested on:

No response

Linked PRs
  • gh-137230

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

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

はじめの一歩

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

調査の方向性

Lib/test/test_typing.py の test_get_type_hints_generic と test_get_type_hints_classes から始め、次に _typed_dict_helper 内の参照されている定義を調べてください。先に進む前に、対象を絞った typing テストを実行し、リンクされている PR gh-137230 を確認してください。完了とは、アサーションと名前解決に関する期待値が意図された get_type_hints() の動作を反映し、関連するテストがパスすることです。

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

評価

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

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

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