gpt4 book ai didi

python - 当类没有实现协议(protocol)时 mypy 不会提示

转载 作者:行者123 更新时间:2023-12-05 04:35:52 24 4
gpt4 key购买 nike

我有以下代码。类 A 包含函数 f。类 B 继承自 A 并覆盖此函数。我还有 SupportsG 协议(protocol),它充当所有实现函数 g 的类的结构父类(super class)型。我有 B 类显式继承此协议(protocol):

from typing import Protocol

class SupportsG(Protocol):
def g(self) -> str: ...

class A:
def f(self) -> str:
return ""

class B(A, SupportsG):
def f(self) -> str:
return "test"

if __name__ == "__main__":
b = B()

我的预期是 mypy 会抛出一个错误,因为类 B 没有实现函数 g。但是,如果我运行 mypy --strict,我不会收到任何错误。

我的理解有什么差距?

最佳答案

def test(x: SupportsG):
pass # whatever

a = A()
b = B()

test(a) # mypy should complain
test(b) # mypy should complain

class C:
def g(self) -> str:
return ""

c = C()
test(c) # should be fine

您不需要从 SupportsG 继承您的类。

顺便说一句,Protocol 的一个目的也是使用 kwargs 定义自定义函数接口(interface),这对于 Callable 是不可能的,例如:

def func(a, *, b) -> str:
pass

class Func(Protocol):
def __call__(self, a, *, b) -> str: ...

def test(f: Func):
pass

test(func) # ok!

关于python - 当类没有实现协议(protocol)时 mypy 不会提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70952986/

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