- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在改进我的 Python 开发工作的道路上。我有兴趣在 CI/deb 构建时测试使用 Protocol 定义的接口(interface),这样如果接口(interface)实际上没有被类实现,我们将在单元测试运行后立即知道。
我的方法是使用 Protocol 进行输入并使用 implements runtime_checkable 来构建单元测试。这行得通,但团队就如何指示具体实现协议(protocol)而不破坏 runtime_checkable 展开了一场小辩论。在 C++/Java 中,您需要继承来指示接口(interface)的实现,但在 Python 中,您不一定需要继承。谈话的中心是我们是否应该从协议(protocol)接口(interface)类继承。
在最后考虑这个代码示例,它提供了问题的大部分要点。我们正在考虑 Shape 并指出如何向 future 的开发人员暗示 Shape 正在提供 IShape,但是通过继承这样做会使 isinstance 的 runtime_checkable 版本无法用于其单元测试目的。
这里有几个改进的途径:
我们可以找到一种更好的方式来暗示 Shape 实现了不涉及直接继承的 IShape。我们可以找到一种更好的方法来检查接口(interface)是否在测试 deb 包构建时实现。也许 runtime_checkable 是错误的想法。
有人得到了如何更好地使用 Python 的指导吗?谢谢!
from typing import (
Protocol,
runtime_checkable
)
import dataclasses
@runtime_checkable
class IShape(Protocol):
x: float
@dataclasses.dataclass
class Shape(IShape):
foo:float = 0.
s = Shape()
# evaluates as True but doesnt provide the interface. Undermines the point of the run-time checkable in unit testing
assert isinstance(s, IShape)
print(s.x) # Error. Interface wasnt implemented
#
# Contrast with this assert
#
@dataclasses.dataclass
class Goo():
x:float = 1
@dataclasses.dataclass
class Hoo():
foo: float = 1
g = Goo()
h = Hoo()
assert isinstance(g, IShape) # asserts as true
# but because it has the interface and not because we inherited.
print(g.x)
assert isinstance(h, IShape) # asserts as False which is what we want
最佳答案
在谈论静态类型检查时,有助于理解子类型与子类不同的概念。 (在 Python 中,类型和类是同义词;在 mypy
等工具实现的类型系统中并非如此。)
类型T
是类型S
的名义 子类型,如果我们明确说明它是的话。子类化是名义子类型化的一种形式:T
是 S
的子类型,如果(但不是仅如果)T
是 S
的子类。
T
类型是 S
类型的结构子类型,如果它与 T
本身兼容S
。协议(protocol)是 Python 的结构子类型化实现。 Shape
不需要是 IShape
的标称子类型(通过子类化)才能成为 IShape
的结构子类型(通过具有x
属性)。
因此,将 IShape
定义为 Protocol
而不仅仅是 Shape
的父类(super class)的意义在于支持结构子类型化并避免需要名义子类型化(以及继承可能引入的所有问题)。
class IShape(Protocol):
x: float
# A structural subtype of IShape
# Not a nominal subtype of IShape
class Shape:
def __init__(self):
self.x = 3
# Not a structural subtype of IShape
class Unshapely:
def __init__(self):
pass
def foo(v: IShape):
pass
foo(Shape()) # OK
foo(Unshapely()) # Not OK
那么结构子类型是否可以替代名义子类型?一点也不。继承有它的用处,但是当它是您的唯一子类型化方法时,它会被不恰本地使用。一旦您在类型系统中区分了结构子类型和名义子类型,您就可以使用适合您实际需要的子类型。
关于python - 暗示类正在实现协议(protocol)的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73069962/
我可以看到有状态的协议(protocol)可以减少像 cookie 这样的“模拟状态”。 但是测试变得更加难以确保您的实现正确并重新连接,并且 session 继续可能很难处理。 始终使用无状态协议(
我正在尝试为我的下一个分布式应用程序找到合适的协议(protocol)中间件。在过去的几天里,我找到了几个规范,想知道我是否错过了一个重要的规范?它应该是二进制协议(protocol),支持 RPC,
我正在做一个研究生院软件工程项目,我正在寻找管理 ATM 和银行网络之间通信的协议(protocol)。 我已经在谷歌上搜索了很长一段时间,虽然我找到了各种有关 ATM 的有趣信息,但我惊讶地发现似乎
我正在开发一个 ECG 模块,它以字节为单位给出数据。有一个关于它的协议(protocol)文档解释了如何构建从模块中出来的数据包。我想解码该数据。我很困惑 Protocol Buffer 是否会对此
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 3年前关闭。 Improve this qu
我需要在我的程序中包含基本的文件发送和文件接收例程,并且需要通过 ZMODEM 协议(protocol)。问题是我无法理解规范。 供引用,here is the specification . 规范没
我最近听到这个术语来描述 Google 的新环聊协议(protocol)和 Whisper System 的新 encrypted texting app . The new TextSecure p
如何检查某个对象是否符合协议(protocol)? 我试过这种方式,但出现错误: if lCell.conformsToProtocol(ContentProtocol) { } 最佳
在应用程序中,我们有两种类型的贴纸,字符串和位图。每个贴纸包都可以包含两种类型。这就是我声明模型的方式: // Mark: - Models protocol Sticker: Codable { }
这个问题在这里已经有了答案: Why can't a get-only property requirement in a protocol be satisfied by a property w
我有以下快速代码: protocol Animal { var name: String { get } } struct Bird: Animal { var name: String
我在遵循继承树的几个类中分配协议(protocol)。像这样: 头等舱 @protocol LevelOne - (void) functionA @end @interface BaseClass
我们之前使用的是 fix,但客户说使用 OUCH 进行交易,因为这样速度更快。我在互联网上查了一下,消息看起来很相似。它如何获得速度优势。请给我一些示例消息 最佳答案 基本上,FIX 消息以文本格式传
在我的 swift 项目中,我有一个使用协议(protocol)继承的案例,如下所示 protocol A : class{ } protocol B : A{ } 接下来我要实现的目标是声明另一个具
我想根据这两种协议(protocol)的一般特征(例如开销(数据包)、安全性、信息建模和可靠性)来比较 OPC UA 和 MQTT。我在哪里可以找到每个协议(protocol)的开销和其他特性的一些示
本质上,我的最终目标是拥有一个协议(protocol) Log,它强制所有符合它的对象都有一个符合另一个协议(protocol) [LogEvent] 的对象数组. 但是,符合Log的类需要有特定类型
我正在尝试为基于左操作数和右操作数标识的协议(protocol)实现 Equatable 协议(protocol)。换句话说:我如何为一个协议(protocol)实现 Equatable 协议(pro
问题不在于编程。 我正在使用一台旧机器,微软停止了这些机器的补丁。 有没有人针对攻击者已知的使用端口 445 的 SMB 协议(protocol)漏洞的解决方案? 任何棘手的解决方案? 换句话说,我想
在我们的业务中,我们需要记录到达我们服务器的每个请求/响应。 目前,我们使用 xml 作为标准实现。 如果我们需要调试/跟踪某些错误,则使用日志文件。 如果我们切换到 Protocol Buffer
你推荐什么协议(protocol)定义? 我评估了 Google 的 Protocol Buffer ,但它不允许我控制正在构建的数据包中字段的位置。我认为 Thrift 也是如此。我的要求是: 指定
我是一名优秀的程序员,十分优秀!