def unify(self, t1, t2):
if isinstance(t1, TypeVar) and isinstance(t2, TypeVar):
if t1 == t2:
# TODO: look into implementation of __eq__ TVARS
pass
else:
node1, node2 = self._tvar_tnode[t1], self._tvar_tnode[t2]
self._union(node1, node2)
elif isinstance(t1, TypeVar):
node2 = self.add_concrete_to_sets(t2)
node1 = self._tvar_tnode[t1]
self._union(node1, node2)
elif isinstance(t2, TypeVar):
self.unify(t2, t1)
elif isinstance(t1, GenericMeta) and isinstance(t2, GenericMeta):
self._unify_generic(t1, t2)
elif isinstance(t1, CallableMeta) and isinstance(t2, CallableMeta):
rtype = self.unify_call(t1, *t2.__args__[:-1])
self.unify(rtype, t2.__args__[-1])
elif isinstance(t1, TupleMeta) and isinstance(t2, TupleMeta):
self._unify_tuple(t1, t2)
elif t1.__class__.__name__ == '_Union' or t2.__class__.__name__ == '_Union':
pass
elif t1 == Any or t2 == Any:
pass
elif isinstance(t1, _ForwardRef) and isinstance(t2, _ForwardRef) and t1 == t2:
pass
elif isinstance(t1, _ForwardRef) or isinstance(t2, _ForwardRef):
raise Exception(str(t1) + ' ' + str(t2))
elif issubclass(t1, t2) or issubclass(t2, t1):
pass
elif t1 != t2:
raise TypeInferenceError(str(t1) + ' ' + str(t2))
评论列表
文章目录