Q:

Typing Variadic Tuple in Python3

So I'm trying to type hint a Tuple of Tuples where I have something like this:
from typing import List, Tuple
def foo(arg: Tuple[Tuple[int]]):
    for tpl in arg:
        for thing_id in tpl:
            # do stuff

Where there can be more than one tuple in the tuple of tuples and there can be more than one integer in the tuples but there should only ever be a tuple of tuples of integers.  In other words, I want both of these to work:
foo(((1,),))

foo(((1,2,3),(4,5))) # doesn't pass the checker which expects length == 1

but this to fail
foo(((1,"x"),))

Now I can use lists:
def bar(arg: List[List[int]]):
    print(arg)

and everything works as expected.  But I want to default the argument and would prefer not to have a mutable default argument.  Nor is there any reason to use a mutable structure here.  Any way to do this? 

A:

From the docs:

To specify a variable-length tuple of homogeneous type, use literal ellipsis, e.g. Tuple[int, ...]. 

Thus, your type annotation would be Tuple[Tuple[int, ...], ...], for a variable-length tuple of variable-length tuples of ints. 
If your only reason for specifying tuples in your annotation is that you don't want a mutable default argument, then it's probably more appropriate to specify a sequence of sequences, or an iterable of iterables, depending on what functionality you need:
arg: Iterable[Iterable[int]]=((1, 2), (3, 4))

