Как исправить mypy, чтобы разрешить вывод типов из словаря с интерфейсамиPython

Программы на Python
Гость
Как исправить mypy, чтобы разрешить вывод типов из словаря с интерфейсами

Сообщение Гость »

Итак, у нас есть действительно простой инжектор, который как раз соответствует нашим потребностям. Теперь мы хотим иметь вывод типа, но нам очень сложно заставить его работать с mypy. Вот мини-пример, воспроизводящий проблему:

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

from abc import ABC, abstractmethod
from typing import Type, TypeVar, Dict

class Interface(ABC):
@abstractmethod
def method(self):
pass

class Implementation(Interface):
pass

T = TypeVar("T", covariant=True)
def get_implementation(interface: Type[T], *args, **kwargs) -> T:
dictionary: Dict[Type[T], T] = {Interface: Implementation}
return dictionary[interface](*args, **kwargs)

implementation = get_implementation(Interface)
Вы можете запустить этот код на https://mypy-play.net/?mypy=0.971&python=3.6. Вы получите следующую ошибку:

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

main.py:15: error: Dict entry 0 has incompatible type "Type[Interface]": "Type[Implementation]"; expected "Type[T]": "T"
main.py:16: error: "object" not callable
main.py:19: error: Only concrete class can be given where "Type[Interface]" is expected
Честно говоря, я понятия не имею, как их исправить. Мне код кажется правильным, но mypy явно не думает так же. Есть идеи, как сделать такой тип инъекции безопасным?

Подробнее здесь: https://stackoverflow.com/questions/760 ... interfaces

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