gpt4 book ai didi

python - 抽象类和字典的 mypy 问题

转载 作者:行者123 更新时间:2023-12-05 00:39:54 24 4
gpt4 key购买 nike

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

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[str, Type[Interface]] = {'A': A, 'B': B}

谢谢@jonafato

归功于 mypy 问题 18433048用于显示此语法。

关于python - 抽象类和字典的 mypy 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54241721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com