Создание подкласса универсального класса с аргументами ключевого слова

Я пытаюсь наследовать универсальный класс с переменными аргументами ключевого слова в 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

Вы можете использовать Unpack[TypedDictClass] для аннотации **kwargs, но вы не можете использовать его в качестве аргумента типа ParamSpec. Возможные дубликаты: Как указать общий тип вместо TypedDict? , Использование Unpack в TypeVar для динамического создания сигнатур функций.

InSync 15.06.2024 06:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, как упоминалось в комментариях, точный синтаксис, который вы описываете, в настоящее время не поддерживается. Однако есть несколько других способов его структурирования, которые синтаксически очень похожи. Я бы предложил что-то вроде этого:

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")

Надеюсь это поможет!

Другие вопросы по теме