【问题标题】:Using type hints to denote subclass of multiple classes, i.e. `typing.Intersection`?使用类型提示来表示多个类的子类,即 `typing.Intersection`?
【发布时间】:2023-02-16 21:31:25
【问题描述】:

我正在寻找但无法找到一种简洁的方式来表示类型提示obj: "subclass of A and B"。类型提示 obj: typing.Union[A, B] 不涵盖这种情况,因为它将接受 A 的实例或者B 或其任何子类。

我正在写一个可以由类实现的protocol。 这个接口有一个 __eq__ 方法,可以比较实现这个协议的同一个类的多个实例。通过实现这个协议,类获得了__eq__方法的默认实现。

import typing

@typing.runtime_checkable
class MyInterface(typing.Protocol):

    def __eq__(o1, o2) -> bool:
        ''' checks if `o1` and `o2` are equal to one another '''
        from random import randint
        return bool(randint(0,1)) # TODO: write a better implementation

    ...

我想添加类型提示来表示 1. __eq__ 的两个对象必须是同一类的实例2. 必须执行MyProtocol

以下是我考虑过的事情:

  • 可以像这样定义一个类型变量:T = typing.TypeVar('T') 并在签名中使用它:
def __eq__(o1: T, o2: T) -> bool:

但是,这并不强制实施 MyProtocol

  • 我可以改为明确协议:
def __eq__(o1: 'MyProtocol', o2: 'MyProtocol') -> bool:

然而,这并不能阻止静态类型成为两个不同的类层次结构,没有共享结构,它们都实现了一个协议(例如,BankAccount实现了HasOpenDoor实现了HasOpen)。

实现这一目标的好方法是什么?

【问题讨论】:

  • Pythons 类型系统不支持交集类型

标签: python types python-typing static-typing


【解决方案1】:

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 2021-06-15
    • 2015-05-21
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2021-12-14
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多