我试图找出两个类是否等效,而忽略类型参数。说我有
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
,==
,isinstance
,type
或__class__
中没有一个。对于__name__
来说,定义另一个同名类的人比较脆弱。
对于奖励积分*,我也对一种测试等价性的其他方式感兴趣
A, A[T], A[str], A[int], B, B[T], B[str], B[int]
*不是赏金,不是:p
(上下文是我想找到Generic
以外的类的所有子类)
答案 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__
应该可用于Union
,Optional
,Generic
,Callable
和Tuple
。 / p>
值得注意的是,这是一个实现细节。使用此功能可以使自己承担更改实施而不会发出警告的风险。