抽象类和字典的mypy问题

时间:2019-01-17 18:00:01

标签: python abstract-class mypy abc

Greating,请考虑以下代码。

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'

我得到的错误与尝试直接实例化一个抽象类(这是奇怪的considering this reference for mypy)一样。

error: Cannot instantiate abstract class 'Interface' with abstract attribute 'method'

此外,如果我现在制作mapping = {'A': A}(即删除'B': B),create_map也可以通过。

有人可以阐明这一点吗?

1 个答案:

答案 0 :(得分:1)

显然我所缺少的只是映射的类型注释。

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

感谢@jonafato

贷记mypy问题18433048,以显示此语法。