adaptix icon indicating copy to clipboard operation
adaptix copied to clipboard

Невозможно использовать ClassVar в классах наследуемых от Generic

Open amayakasa opened this issue 3 years ago • 0 comments

Пример:

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_

amayakasa avatar Jul 15 '22 13:07 amayakasa