def least_general_unifier(self, t1, t2):
if isinstance(t1, TypeVar) and isinstance(t2, TypeVar):
i1 = self._find(t1)
i2 = self._find(t2)
if issubclass(i1, i2):
return i2
elif issubclass(i2, i1):
return i1
else:
return Any
elif isinstance(t1, TypeVar):
i1 = self._find(t1)
if issubclass(i1, t2):
return t2
elif issubclass(t2, i1):
return i1
else:
return Any
elif isinstance(t2, TypeVar):
return self.least_general_unifier(t2, t1)
elif isinstance(t1, GenericMeta) and isinstance(t2, GenericMeta):
return self._least_general_unifier_generic(t1, t2)
elif isinstance(t1, CallableMeta) and isinstance(t2, CallableMeta):
rtype = self._least_general_unifier_call(t1, *t2.__args__[:-1])
return self.least_general_unifier(rtype, t2.__args__[-1])
elif isinstance(t1, TupleMeta) and isinstance(t2, TupleMeta):
return self._least_general_unifier_tuple(t1, t2)
elif t1.__class__.__name__ == '_Union' or t2.__class__.__name__ == '_Union':
pass
elif t1 == Any or t2 == Any:
return Any
elif issubclass(t1, t2):
return t2
elif issubclass(t2, t1):
return t1
elif t1 != t2:
return Any
评论列表
文章目录