[question] Proper way to implement `ExceptionGroup.derive` method with the existing overloads?
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 5.1k
- フォーク
- 2.1k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 82
説明
Good afternoon,
I was working to implement some custom exception groups in an application that I work on and have had a really hard time getting the types for the derive function to work correctly. Based on reading the documentation linked below, derive is a required method when overriding an exception group to return an instance of it's own class.
Reference
https://docs.python.org/3/library/exceptions.html#BaseExceptionGroup.derive
Reproduction / Example
To reproduce this error, I'll use the example shows in the BaseExceptionGroup page, but with type hints:
from __future__ import annotations
from collections.abc import Sequence
from typing import TypeVar
_ExceptionT_co = TypeVar("_ExceptionT_co", bound=Exception, covariant=True)
_ExceptionT = TypeVar("_ExceptionT", bound=Exception)
class MyGroup(ExceptionGroup[_ExceptionT_co]):
def derive(self, excs: Sequence[_ExceptionT]) -> MyGroup[_ExceptionT]:
return MyGroup(self.message, excs)
Mypy output:
❯ mypy ~/Desktop/example.py
/Users/kkirsche/Desktop/example.py:11: error: Signature of "derive" incompatible with supertype "BaseExceptionGroup" [override]
/Users/kkirsche/Desktop/example.py:11: note: Superclass:
/Users/kkirsche/Desktop/example.py:11: note: @overload
/Users/kkirsche/Desktop/example.py:11: note: def [_ExceptionT <: Exception] derive(self, Sequence[_ExceptionT], /) -> ExceptionGroup[_ExceptionT]
/Users/kkirsche/Desktop/example.py:11: note: @overload
/Users/kkirsche/Desktop/example.py:11: note: def [_BaseExceptionT <: BaseException] derive(self, Sequence[_BaseExceptionT], /) -> BaseExceptionGroup[_BaseExceptionT]
/Users/kkirsche/Desktop/example.py:11: note: Subclass:
/Users/kkirsche/Desktop/example.py:11: note: def [_ExceptionT <: Exception] derive(self, excs: Sequence[_ExceptionT]) -> MyGroup[_ExceptionT]
Found 1 error in 1 file (checked 1 source file)
Given that this is working off an exception group rather than a base exception group, I'm unclear on what the proper way to fix this would be and was wondering if the team here was able to provide an example that satisfies mypy / typeshed's overrides for BaseExceptionGroup's derive function.
Thoughts
Would it potentially make sense to add a derive method to ExceptionGroup which returns Self rather than a hardcoded ExceptionGroup? This seems to align with how the documentation describes using this behavior, but I'm not confident I understand fully to submit a pull request with recommended change(s).
Thanks for your time and help, hope you all are having a great day.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、BaseExceptionGroup.derive のドキュメントを、報告された MyGroup の例および mypy の出力と比較し、その後、BaseExceptionGroup.derive に対する既存の typeshed のオーバーロードを調査します。完了条件は、override の不一致を解決する、サポートされているアノテーションまたは正当な stub の変更を確立し、再現ケースに対して検証することです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- tooling
- issue の種類
- バグ
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 25/100