Python 3.10で呼び出される一般的なUnion型を作成するとします。ResultData
from __future__ import annotations
from dataclasses import dataclass
from typing import TypeVar, Generic, Union
from typing import _SpecialForm, _GenericAlias
@dataclass(frozen=True)
class Error:
description: str
S = TypeVar('S')
ResultData = S | Error
この場合、新しい Python 3.10 Union 構文を使用していることに注意してください。
次に、クラスを継承していくつかのメソッド(モナドのメソッドなど)を追加しようとすると問題が発生します。
T = TypeVar('T')
class Result(ResultData[T]):
def __init__(self):
このクラスを宣言すると、次のエラーがスローされます。
class Result(ResultData[T]):
TypeError: _SpecialForm.__init__() takes 2 positional arguments but 4 were given
Union 型は次の 2 つのクラスから継承しているようです:_SpecialForm
と_GenericAlias
.
_GenericAlias
にはコンストラクタとして 4 つの引数がありますが、引数は_SpecialForm
2 つしかありません。私の推測では、_SpecialForm
コンストラクターはコンストラクターを使用して呼び出される_GenericAlias
ため、エラーが発生します。
次のコードでそれを修正しようとしました:
T = TypeVar('T')
class Result(ResultData[T]):
def __init__(self):
super(_SpecialForm, self).__init__(self._getitem)
super(_GenericAlias, self).__init__(self.origin, self.params, self.inst, self.name)
それでも、同じエラーが発生します。