如何测试泛型类的近似相等性

时间:2019-05-22 19:52:28

标签: python python-3.x generics equality python-typing

我试图找出两个类是否等效,而忽略类型参数。说我有

from typing import Generic, TypeVar

T = TypeVar('T')

class A(Generic[T]):
    pass

class B(Generic[T], A[T]):
    pass

class X:
    pass

我希望接下来的每一行都相等

Generic, Generic[T]
A, A[T], A[str], A[int]
B, B[T], B[str], B[int]
X

is==isinstancetype__class__中没有一个。对于__name__来说,定义另一个同名类的人比较脆弱。

对于奖励积分*,我也对一种测试等价性的其他方式感兴趣

A, A[T], A[str], A[int], B, B[T], B[str], B[int]

*不是赏金,不是:p

(上下文是我想找到Generic以外的类的所有子类)

1 个答案:

答案 0 :(得分:0)

要从A恢复A[T],可以使用__origin__属性,A的属性为None

def compare(a, b):
    if hasattr(a, "__origin__") and hasattr(b, "__origin__"):
        a_origin = a.__origin__ or a
        b_origin = b.__origin__ or b
        return a_origin == b_origin
    else:
        return a == b

compare(A, A[int])  # True
compare(A, B[int])  # False
compare(A, A)  # True
compare(X, X)  # True

根据链接的注释,__origin__应该可用于UnionOptionalGenericCallableTuple。 / p>

值得注意的是,这是一个实现细节。使用此功能可以使自己承担更改实施而不会发出警告的风险。