减少由于使用协议进行结构类型检查而引起的开销

问题描述

我有一个CSP风格的系统,其中每个通道的每种消息类型(通常是数据类,但不一定是)可以不同。我发现自己需要多次重复以下模式

一个过程将定义它期望的特定消息类型(下面的Example数据类),但是应该利用Python的鸭子模式,从而使您可以传递任何结构等效的消息。因此,需要Protocol与mypy进行检查。

Protocol不可实例化,因此它们必须是单独的类。这会导致代码重复,并在名称空间中添加一个与预期类型不同的名称,这似乎不那么理想,这使得Sphinx生成的文档可读性较低。这似乎非常不可思议

有什么方法可以避免必须创建第二类和名称?如果没有,是否有某种方法可以根据另一类自动定义一个?如果不是这样,是否有某种方法可以重用具体类的Protocol类中的字段注释?

class ExampleProtocol(Protocol):
    a: int
    b: str
    c: Any


@dataclass
class Example(ExampleProtocol):
    a: int
    b: str
    c: Any


def uses_examples(example: ExampleProtocol) -> None:
    pass

在理想的世界中,我感觉像下面的代码一样可行。

@dataclass
class Example:
    a: int
    b: str
    c: Any


def uses_examples(example: Interface[Example]) -> None:
    pass

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...