Как ввести подсказку диктанта от классов к экземплярам?

#python-3.x #python-typing

Вопрос:

У меня есть диктант, который сопоставляет классы с экземплярами этих классов. Как я могу ввести подсказку об этом в Python 3?

 from typing import Dict
d : Dict[???, ???] = {}

d[int] = 0
d[str] = "hello world"
 

Комментарии:

1. Dict[typing.Type, typing.Any] ? Я не уверен, что вы можете принудительно указать, что значение должно быть экземпляром ключа (если вы не расширите dict и не переопределите его __setitem__()

Ответ №1:

Я не уверен, что вы можете принудительно указать, что значение должно быть экземпляром ключа с помощью подсказок типа, но если вы открыты для расширения dict класса, вы можете переопределить его __setitem__() :

 class TypedDict(dict):
    def __setitem__(self, key: Type, value: Any):
        if not isinstance(value, key):
            raise TypeError("TypedDict values must be instances of their keys")
        super().__setitem__(key, value)
 

Чтобы использовать это:

 >>> td = TypedDict()
>>> td[int] = 0
{int: 0}

>>> td[float] = 1.0
{int: 0, float: 1.0}

>>> td[str] = -1
TypeError: TypedDict values must be instances of their keys
 

Комментарии:

1. Я не собираюсь применять типы во время выполнения, я просто хочу ввести подсказку, чтобы статические шашки могли улавливать ошибки, такие как «d[str] = 42».

2. @nullUser правильно, я не уверен, что вы можете это сделать, но я не самый опытный в подсказках типа. Я надеюсь, что кто-то, кто это сделает, сможет ответить.