def literal_substitute(t, type_map):
"""Make substitutions in t according to type_map, returning resulting type."""
if isinstance(t, TypeVar) and t.__name__ in type_map:
return type_map[t.__name__]
elif isinstance(t, TuplePlus):
subbed_args = [literal_substitute(t1, type_map) for t1 in t.__constraints__]
return TuplePlus('tup+', *subbed_args)
elif isinstance(t, CallableMeta):
args = list(literal_substitute(t1, type_map) for t1 in t.__args__[:-1])
res = literal_substitute(t.__args__[-1], type_map)
new_t = Callable[args, res]
if hasattr(t, 'polymorphic_tvars'):
new_t.polymorphic_tvars = t.polymorphic_tvars
return new_t
elif isinstance(t, GenericMeta) and t.__args__ is not None:
return _gorg(t)[tuple(literal_substitute(t1, type_map) for t1 in t.__args__)]
else:
return t
评论列表
文章目录