Confusión en la comprensión de tuplas y * args en Python

Necesito una función que estaría tomandovariadic arguments. El número de argumentos puede 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)

La salida del programa anterior es;

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

Si miro este resultado, cuando paso solo 1 argumento enabc1(), la longitud de la tupla se convierte en8(acuerdo*tup), donde como en elabc1() muestra la longitud es1. why and how? Pero lo mismo no funciona de manera diferente cuando paso 2 argumentos en el código anterior. La salida viene comotuple ytuple of tuple. Cómo resolver este problema porque tengo que escribir el código que funcionará para todos los N

Respuestas a la pregunta(1)

Su respuesta a la pregunta