【问题标题】:mypy issues with abstract classes and dictionaries抽象类和字典的 mypy 问题
【发布时间】:2019-01-17 18:00:01
【问题描述】:

太好了,请考虑以下代码。

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 也会通过。

有人能解释一下吗?

【问题讨论】:

  • 如果您输入mapping (mapping: Mapping[str, Type[Interface]] = {'A': A, 'B': B}),一切似乎都正常。感谢 mypy 问题 1843 和 3048 显示此语法。 (但是,为什么 mapping = {'A': A} 没有这个就可以工作超出了我的知识范围。)
  • 不确定我在寻找解决方案时究竟是如何错过了问题 3048,这几乎正是我所要求的。谢谢!

标签: python abstract-class mypy abc


【解决方案1】:

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

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

谢谢@jonafato

感谢 mypy 问题 1843 和 3048 显示此语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多