The builtin set (and therefore the undocumented MyPy/typing TypeAlias Set) had a union method, but its signature is not that restrictive. It takes 1 or more arbitrary iterables of any element type, and of course it returns a set whose element type is the union of the element types of self and those. And the same is true in general for all of the builtin abstract and concrete types. You are right. The union type solves the problem, and is a more precise type
On Fri, Dec 26, 2014 at 10:26 AM, Andrew Barnert
The _opposite_ problem--that it's hard to define the _actual_ type of set.union or similarly highly parameterized types--may be more serious,
Why is it hard? Isn't the actual type just: def union(self, *others: Iterable[Y]) -> Set[Union[X, Y]] where typing of vararg is similar to Java -- all elements must conform to the single type annotation. Also note that I posted set.union method as an example that needs a forward reference to a generic class. I was arguing that if we use strings for forward references, we'll eventually have complicated expressions in those strings, not just class names: class Set(Generic[X]): # Note that the name "Set" is not yet available, so we have to use # a forward reference. This puts the whole return type inside a string. def union(self, *others: Iterable[Y]) -> "Set[Union[X, Y]]": ... Your type for set.union seems to prove the point even better than what I used. Eugene