Как я могу вызвать @staticmethod для аргумента универсального типа (определенного с помощью TypeVar)? [дубликат]Python

Программы на Python
Ответить
Anonymous
 Как я могу вызвать @staticmethod для аргумента универсального типа (определенного с помощью TypeVar)? [дубликат]

Сообщение Anonymous »

У меня есть универсальный класс, в котором я хотел бы вызвать статический метод для аргумента типа, но если я наивно попробую это сделать, как в следующем примере, я получу ошибку, поскольку идентификатор, представляющий тип, на самом деле является экземпляром TypeVar, у которого нет этого атрибута:

Код: Выделить всё

from abc import ABC, abstractmethod
from typing import Generic, TypeVar

class MyInterface(ABC):
@staticmethod
@abstractmethod
def default() -> int: ...

class SubclassA(MyInterface):
@staticmethod
def default() -> int:
return 0

class SubclassB(MyInterface):
@staticmethod
def default() -> int:
return 1

SomeSubclass = TypeVar('SomeSubclass', bound=MyInterface)

class InterfaceContainer(Generic[SomeSubclass]):
def check_if_default(self, value: int) -> bool:
return value == SomeSubclass.default()  # AttributeError: 'TypeVar' object has no attribute 'default'

# optional, shows runtime error even without static type checking:
container = InterfaceContainer[SubclassA]()
container.check_if_default(42)
< /code>
Как я могу получить доступ к атрибутам типа, указанного как аргумент? это связанный вопрос, в котором я узнал, как получить доступ к аргументу, учитывая тип интерфейкконтейнер [subclassa] 
(например, через __args __ со времен Python 3.6+), но контейнер экземпляра не имеет __args__ и type (intainer) или cls в @classmethod Просто дайте мне Generic Type Interfacecontainer без его аргумента.
Интересно, если экземпляры общего класса полностью теряют информацию о своем типе, может быть, потому что она предназначена только для проверки типа?

Подробнее здесь: https://stackoverflow.com/questions/793 ... th-typevar
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»