Наследование типа Union в Python 3.10
Скажем, мы создаем общий тип Union под названием
ResultData
в Python 3.10
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 наследуются от следующих двух классов: и.
имеет 4 аргумента в качестве конструктора и только два. Я предполагаю , что
_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)
Тем не менее, я все еще получаю ту же ошибку.