Я пытаюсь наследовать универсальный класс с переменными аргументами ключевого слова в Python 3.10.
from typing_extensions import Unpack, TypeVar, ParamSpec
P = ParamSpec("P")
T = TypeVar("T")
class A(Generic[P]):
def func(self, *args: P.args, **kwargs: P.kwargs):
print(args)
print(kwargs)
return 2
class Inputs(TypedDict):
arg1: int
arg2: str
class B(A[Unpack(Inputs)]): # Line where mypy fails
pass
B().func(arg1=1, arg2 = "Hello")
Однако mypy (1.10.0) не проходит эту проверку по следующей причине. Есть ли другой способ реализовать эту функцию? Я видел, как это используется в Callables, но предпочитаю не подходить к этому таким образом.
error: Unpack is only valid in a variadic position
Итак, как упоминалось в комментариях, точный синтаксис, который вы описываете, в настоящее время не поддерживается. Однако есть несколько других способов его структурирования, которые синтаксически очень похожи. Я бы предложил что-то вроде этого:
from typing_extensions import TypeVar
from dataclasses import dataclass
T = TypeVar("T")
class A(Generic[T]):
def func(self, settings: T):
return 2
@dataclass
class Settings:
arg1: int
arg2: str
class B(A[Settings]):
pass
B().func(Settings(arg1=1, arg2 = "Hello"))
В качестве альтернативы, если вам нужна структура TypedDict
, это можно сделать, назначив func как переменную класса:
from typing import Callable, ClassVar, TypedDict
from typing_extensions import Unpack, TypeVar
class Inputs(TypedDict):
arg1: int
arg2: str
@staticmethod
def input_func(**kwargs: Unpack[Inputs]):
return kwargs
class A:
func: ClassVar[Callable]
class B(A):
func = input_func
B().func(arg1=1, arg2 = "Hello")
Надеюсь это поможет!
Вы можете использовать
Unpack[TypedDictClass]
для аннотации**kwargs
, но вы не можете использовать его в качестве аргумента типаParamSpec
. Возможные дубликаты: Как указать общий тип вместо TypedDict? , Использование Unpack в TypeVar для динамического создания сигнатур функций.