2012-06-13 20 views
12

Ho il seguente codice Python (sto usando Python 2.7.X):String.Format() con segnaposto opzionali

my_csv = '{first},{middle},{last}' 
print(my_csv.format(first='John', last='Doe')) 

ottengo un'eccezione KeyError perche 'mezzo' non è specificato (questo è previsto). Tuttavia, voglio che tutti quei segnaposto siano opzionali. Se quei parametri denominati non sono specificati, mi aspetto che i segnaposto vengano rimossi. Così la stringa stampata sopra dovrebbe essere:

John,,Doe 

C'è costruito nel funzionalità per fare quei segnaposto opzionale, o è ancora un po 'nel lavoro di profondità necessaria? Se quest'ultimo, se qualcuno potesse mostrarmi la soluzione più semplice, lo apprezzerei!

risposta

14

Ecco una sola opzione:

from collections import defaultdict 

my_csv = '{d[first]},{d[middle]},{d[last]}' 
print(my_csv.format(d=defaultdict(str, first='John', last='Doe'))) 
+0

Vedo che stai usando 'str'. Cos'è questo? Edit: vedo ora che questo è il metodo factory, non un nome variabile. Quindi la fabbrica creerà stringhe vuote. –

5

Ecco un'altra opzione che utilizza l'operatore di interpolazione di stringhe %:

class DataDict(dict): 
    def __missing__(self, key): 
     return '' 

my_csv = '%(first)s,%(middle)s,%(last)s' 
print my_csv % DataDict(first='John', last='Doe') # John,,Doe 

In alternativa, se si preferisce usare il più moderno metodo di str.format(), la seguente sarebbe anche funziona, ma è meno automatico, nel senso che definirai in anticipo tutti i possibili segnaposto (sebbene tu possa modificare DataDict.placeholders on-th e-fly se lo si desidera):

class DataDict(dict): 
    placeholders = 'first', 'middle', 'last' 
    default_value = '' 
    def __init__(self, *args, **kwargs): 
     self.update(dict.fromkeys(self.placeholders, self.default_value)) 
     dict.__init__(self, *args, **kwargs) 

my_csv = '{first},{middle},{last}' 
print(my_csv.format(**DataDict(first='John', last='Doe'))) # John,,Doe 
2
"It does{cond} contain the the thing.".format(cond="" if condition else " not") 

Ho pensato di aggiungere questo perché è stato una caratteristica in quanto la questione è stato chiesto, la domanda si apre ancora presto nei risultati di Google, e questo metodo è costruito direttamente nella sintassi python (non sono richieste importazioni o classi personalizzate). È un semplice shortcut conditional statement. Sono intuitive da leggere (se mantenute semplici) ed è spesso utile che siano short-circuit.

+0

Mentre le risposte sono sempre apprezzate, questa domanda è stata posta e ha risposto 5 anni fa e aveva già una soluzione accettata. Aiuta molto anche a fornire alcune informazioni su come il tuo codice risolve il problema in questione. Si prega di fornire alcuni [contesto che circonda la risposta] (https://meta.stackexchange.com/a/148274) e consultare l'articolo [articolo di assistenza] (http://stackoverflow.com/help/how-to-answer) per informazioni su come scrivere ottime risposte :) –