def pack_tups(*args):
    import numpy as np
    _DEBUG = False
    NOT_ITER = -1
    UNINIT_VAL = -1
    if _DEBUG:
        print("args = {0}".format(args))
    class StrNoIter(str):
        def __iter__(self):
            raise NotImplementedError("Non-iterable string")
    mod_args = [(StrNoIter(a) if isinstance(a, str) else a) for a in args]
    iterlens = [(len(a) if iterable(a) else NOT_ITER) for a in mod_args]
    maxiter = max(iterlens)
    if not all(map(lambda v: v in (NOT_ITER, maxiter), iterlens)):
        raise ValueError("All iterable items must be of equal length")
    if maxiter == NOT_ITER:
        return [args]
    tups = list(zip(*[(np.repeat(a, maxiter) if l == NOT_ITER else a)
            for (a,l) in zip(mod_args, iterlens)]))
    if _DEBUG:
        print("tups = {0}".format(tups))
    return tups