2013-08-22 1 views
8

Sappiamo che la formattazione uno argomento può essere fatto utilizzando uno%s in una stringa:python - Come formattare il numero variabile di argomenti in una stringa?

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

per due argomenti, possiamo usare due %s (duh!):

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

Quindi, come posso formattare un numero variabile di argomenti senza dover definire esplicitamente all'interno della stringa di base un numero di %s uguale al numero di argomenti da formattare? sarebbe molto bello se qualcosa di simile esiste:

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

Questo è anche possibile o l'unica cosa che ho potuto fare a questo proposito è quello di fare qualcosa di simile:

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

NOTA: I bisogno per farlo con l'operatore di formattazione delle stringhe %s.

UPDATE:

Ha bisogno di essere con il %s perché una funzione da un'altra libreria formati mia stringa usando quel determinato gestore che mi passa la stringa formattata e gli argomenti per formattarlo, ma rende alcuni controlli e correzioni (se necessario) sugli argomenti prima di realizzare effettivamente la formattazione.

quindi ho bisogno di chiamarlo:

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

Grazie per il vostro aiuto!

+2

Perché * ci * è necessario * per noi e l'operatore '% s'? Non ha molto senso; usa 'str()' invece. –

+0

In che modo l'operatore "cool qui" specifica come connettere i valori?Non vuoi che stampi solo "Ciao JohnJoeMary" o "Ciao" ("John", "Joe", "Mary") ", vero? Potresti volere "Ciao Giovanni, Joe, Maria" o "Ciao Giovanni, Joe e Maria" o "Ciao Giovanni, Joe e Maria" o un milione di altre cose; non c'è alcun modo in cui un singolo operatore potrebbe lasciarti fare tutti questi. – abarnert

+0

Dovresti comunque essere in grado di chiamarlo con 'function_in_library (" Hello% s ",", ".join ([" John "," Joe "," Mary "])' – Oli

risposta

16

usereste str.join() sulla lista senza formattazione di stringhe, quindi interpolare la risultato:

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

Demo:

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

Se alcuni dei vostri argomenti non sono ancora stringhe , utilizzare un elenco di comprensione:

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

o utilizzare map(str, ...):

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

che faresti lo stesso con la vostra funzione:

Se si sono limitati da una restrizione (piuttosto arbitraria) che non si può usare un join nel elenco di argomenti di interpolazione, utilizzare un join per creare la stringa di formattazione:

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

Anche se hai ragione, penso di non aver spiegato abbastanza chiaramente la mia domanda. la formattazione, una funzione esistente è, mi dispiace, ma grazie, aggiornerò la mia domanda – Gerard

+0

Mi spiace di non poter "unire" gli argomenti, ognuno deve essere elaborato dalla funzione di libreria prima della formattazione Grazie – Gerard

+1

Questo è un limitazione piuttosto arbitraria, in questo caso costruisci gli elementi stringa '% s' usando un join separato:' "Hello% s"% "," .join (['% s'] * len (my_args)). "Nota l'ironia qui, stai creando la stringa usando * la stessa tecnica *. –