python – ¿Cómo formatear el número variable de argumentos en una cadena?

Sabemos que el formato de un argumento se puede hacer usando one %s en una cadena:

 >>> "Hello %s" % "world" 'Hello world' 

para dos argumentos, podemos usar dos %s (duh!):

 >>> "Hello %s, %s" % ("John", "Joe") 'Hello John, Joe' 

Entonces, ¿cómo puedo formatear un número variable de argumentos sin tener que definir explícitamente dentro de la cadena base un número de %s igual al número de argumentos para dar formato ? Sería muy bueno si algo como esto existe:

 >>> "Hello " % ("John", "Joe", "Mary") Hello JohnJoeMary >>> "Hello " % ("John", "Joe", "Mary", "Rick", "Sophie") Hello JohnJoeMaryRickSophie 

¿Es esto posible o lo único que podría hacer al respecto es hacer algo como:

 >>> my_args = ["John", "Joe", "Mary"] >>> my_str = "Hello " + ("".join(["%s"] * len(my_args))) >>> my_str % tuple(my_args) "Hello JohnJoeMary" 

NOTA: Necesito hacerlo con el operador de formato de cadena %s .

ACTUALIZACIÓN :

Debe estar con el %s porque una función de otra biblioteca formatea mi cadena usando ese operador, dado que paso la cadena sin formato y los argumentos para formatearla, pero hace algunas comprobaciones y correcciones (si es necesario) en los argumentos antes de la realidad. Haciendo el formateo.

Así que necesito llamarlo:

 >>> function_in_library("Hello ", ["John", "Joe", "Mary"]) "Hello JohnJoeMary" 

¡Gracias por tu ayuda!

str.join() en la lista sin formato de cadena, y luego interpolaría el resultado :

 "Hello %s" % ', '.join(my_args) 

Manifestación:

 >>> my_args = ["foo", "bar", "baz"] >>> "Hello %s" % ', '.join(my_args) 'Hello foo, bar, baz' 

Si algunos de sus argumentos aún no son cadenas, use una lista de comprensión:

 >>> my_args = ["foo", "bar", 42] >>> "Hello %s" % ', '.join([str(e) for e in my_args]) 'Hello foo, bar, 42' 

o usar el map(str, ...) :

 >>> "Hello %s" % ', '.join(map(str, my_args)) 'Hello foo, bar, 42' 

Harías lo mismo con tu función:

 function_in_library("Hello %s", ', '.join(my_args)) 

Si está limitado por una restricción (bastante arbitraria) de que no puede usar una join en la lista de argumentos de interpolación, use una join para crear la cadena de formato en su lugar:

 function_in_library("Hello %s" % ', '.join(['%s'] * len(my_args)), my_args)