MyPy проблемы с абстрактными классами и словарями - PullRequest
0 голосов
/ 17 января 2019

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 также пройдет.

Может кто-нибудь пролить свет на это?

1 Ответ

0 голосов
/ 17 января 2019

Очевидно, что мне не хватало только аннотации типа для сопоставления.

mapping: Mapping[str, Type[Interface]] = {'A': A, 'B': B}

Спасибо @ jonafato

Благодарим за проблемы с Mypy 1843 и 3048 за показ этого синтаксиса.

...