Confusão na compreensão de tupla e * args em Python

Eu preciso de uma função que levariavariadic arguments. O número de argumentos pode variar de 1 a N.

def abc(*args):
    print "ABC"
    print args
    print len(args)

def abc1(*args):
    print "ABC1"
    print args
    print len(args)
    print "------------"


tup = ("Hello123")
abc(*tup)
abc1(tup)
tup = ("Hello123", "Hello1234")
abc(*tup)
abc1(tup)

A saída do programa acima é;

ABC
('H', 'e', 'l', 'l', 'o', '1', '2', '3')
8
ABC1
('Hello123',)
1
------------
ABC
('Hello123', 'Hello1234')
2
ABC1
(('Hello123', 'Hello1234'),)
1
------------

Se eu olhar para esta saída, quando estou passando apenas 1 argumento emabc1(), o comprimento da tupla se torna8(guardando*tup), onde, como noabc1() mostra o comprimento é1. why and how? Mas o mesmo não está funcionando de maneira diferente quando estou passando 2 argumentos no código acima. A saída vem comotuple etuple of tuple. Como resolver esse problema, porque eu tenho que escrever o código que funcionará para todos os N

questionAnswers(1)

yourAnswerToTheQuestion