def can_unify(self, t1, t2):
"""Return true iff given argument types can be unified."""
if isinstance(t1, TypeVar) or isinstance(t2, TypeVar):
return True
elif isinstance(t1, GenericMeta) and isinstance(t2, GenericMeta):
if _gorg(t1) is not _gorg(t2):
return False
elif t1.__args__ is not None and t2.__args__ is not None:
for a1, a2 in zip(t1.__args__, t2.__args__):
if not self.can_unify(a1, a2):
return False
return True
else:
return False
elif isinstance(t1, GenericMeta):
return False
elif isinstance(t2, GenericMeta):
return False
elif t1.__class__.__name__ == '_Union' and t2.__class__.__name__ == 'Union':
for union_type in t1.__args__:
if union_type in t2.__args__:
return True
else:
return False
elif t1.__class__.__name__ == '_Union':
if t2 in t1.__args__:
return True
else:
return False
elif t2.__class__.__name__ == '_Union':
if t1 in t2.__args__:
return True
else:
return False
elif t1 == Any or t2 == Any:
return True
elif (hasattr(t1, 'msg') and ('not found' in t1.msg)) or (hasattr(t2, 'msg') and ('not found' in t2.msg)):
return False
elif isinstance(t1, _ForwardRef) and isinstance(t2, _ForwardRef) and t1 == t2:
return True
elif isinstance(t1, _ForwardRef) or isinstance(t2, _ForwardRef):
return False
elif issubclass(t1, t2) or issubclass(t2, t1):
return True
elif t1 != t2:
return False
else:
return True
评论列表
文章目录