adaptix
adaptix copied to clipboard
Невозможно использовать ClassVar в классах наследуемых от Generic
Пример:
from dataclasses import dataclass
from typing import ClassVar, Generic, TypeVar
from uuid import uuid4
import dataclass_factory
T = TypeVar("T")
@dataclass
class Session:
user_identifier: int
session_identifier: str
@dataclass
class Event(Generic[T]):
key: ClassVar[str | None] = None
value: T
class SessionLogin(Event[Session]):
key = "sessions.session.login"
event = SessionLogin(Session(1, uuid4().hex))
factory = dataclass_factory.Factory()
factory.dump(event)
Код вызовет TypeError со следующим сообщением: typing.ClassVar accepts only single type. Got (str | None,).
Проблема находится в generics.py:32. Не учтена возможность, что тип может быть один, а не несколько, что в результате приводит к ошибке.
Проблема втупую решается добавлением проверки:
def fill_type_args(args: Dict[Type, Type], type_: Type) -> Type:
type_ = args.get(type_, type_)
if is_generic_concrete(type_):
origin = COMPAT_ORIGINS.get(type_.__origin__, type_.__origin__)
if len(type_.__args__) == 1:
return origin[type_.__args__[0]]
type_args = [fill_type_args(args, arg) for arg in type_.__args__]
return origin[type_args]
return type_