gpt4 book ai didi

python - 如何获得一个抽象数据类来传递mypy?

转载 作者:行者123 更新时间:2023-12-04 11:53:33 29 4
gpt4 key购买 nike

mypy v0.910 拒绝 Python 3.9 中的抽象数据类。这是最小的可重现示例:

from abc import ABC, abstractmethod
from dataclasses import dataclass

@dataclass
class Liquid(ABC):

@abstractmethod
def drip(self) -> None:
pass
这是错误消息:
$ mypy --python-version 3.9 so.py
so.py:4: error: Only concrete class can be given where "Type[Liquid]" is expected
Found 1 error in 1 file (checked 1 source file)
如何让此代码通过 mypy?

备注
我来自 mypy issue #5374这是 mypy 中的一个错误,于 2018 年首次注意到,但仍未得到纠正。不过,我认为人们必须将 mypy 与抽象数据类一起使用,因此必须有一种解决方法或正确的方法来定义或注释该类。推荐什么?
错误消息的基础似乎是 mypy 假设任何类型的对象 Type可以实例化,但不能实例化抽象类。这似乎是自 Type 以来的错误是 defined表示类对象,不一定是具体的类对象(即可以实例化的对象)。
添加 # type: ignore到包含 class Liquid 的行不会阻止错误消息。由于代码不包含 Type[Liquid] ,我想它一定在由 dataclass 生成的代码中. Type在 Python 3.9 中已弃用,但显然 dataclass代码生成器仍然生成它。

最佳答案

创建一个数据类作为 mixin 并让 ABC 类继承它:

@dataclass
class LiquidDataclassMixin:
my_var: str

class Liquid(ABC, LiquidDataclassMixin):
@abstractmethod
def drip(self) -> None:
pass
这也适用于 mypy 类型检查。我建议不要使用 # type: ignore因为这违背了类型检查的意义。取自 this GitHub issue .

关于python - 如何获得一个抽象数据类来传递mypy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69330256/

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