Greatings, рассмотрите следующий код.
from abc import ABC, abstractmethod
class Interface(ABC):
@abstractmethod
def method(self) -> None:
pass
class A(Interface):
def method(self) -> None:
pass
class B(Interface):
def method(self) -> None:
pass
mapping = {'A': A, 'B': B}
# does NOT pass mypy checks
def create_map(param: str) -> Interface:
if param in mapping:
return mapping[param]()
else:
raise NotImplementedError()
# passes mypy checks
def create_if(param: str) -> Interface:
if param == 'A':
return A()
elif param == 'B':
return B()
else:
raise NotImplementedError()
По какой-то причине create_if
проходит все проверки типа mypy
, а create_map
- нет. reveal_type
для обеих функций - 'def (param: builtins.str) -> test.Interface'
.
Ошибка, которую я получаю, такая же, как если бы я пытался создать экземпляр абстрактного класса напрямую, что странно , учитывая эту ссылку для mypy .
error: Cannot instantiate abstract class 'Interface' with abstract attribute 'method'
Кроме того, если я сделаю mapping = {'A': A}
(то есть удалим 'B': B
), теперь create_map
также пройдет.
Может кто-нибудь пролить свет на это?