2012-06-13 16 views
12

ich folgenden Python-Code habe (Ich verwende Python 2.7.x):string.format() mit optionalen Platzhalter

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

ich eine KeyError Ausnahme erhalten, weil 'Mitte' nicht angegeben ist (dies ist erwartet). Ich möchte jedoch, dass alle diese Platzhalter optional sind. Wenn diese benannten Parameter nicht angegeben sind, erwarte ich, dass die Platzhalter entfernt werden. So druckte die Zeichenfolge oben sollte sein:

John,,Doe 

Gibt es in der Funktionalität gebaut diese Platzhalter optional zu machen, oder ist etwas mehr in die Tiefe Arbeit erforderlich? Wenn Letzteres, wenn jemand mir die einfachste Lösung zeigen könnte, würde ich es schätzen! Hier

Antwort

14

ist Option:

from collections import defaultdict 

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

Ich sehe, Sie verwenden 'str'. Was ist das? Edit: Ich sehe jetzt, dass dies die Factory-Methode ist, kein Variablenname. Die Factory erstellt leere Zeichenfolgen. –

5

Hier ist eine weitere Option, die die Zeichenfolge Interpolationsoperator verwendet %:

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 

Alternativ, wenn Sie die modernere str.format() Methode bevorzugen verwenden, wäre die folgende auch funktionieren, aber ist weniger automatisch in dem Sinne, dass Sie jeden möglichen Platzhalter im Voraus explizit definiert haben (obwohl Sie DataDict.placeholders on-th ändern können) e-fly falls gewünscht):

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") 

dachte ich, das hinzufügen würde, weil es ein Merkmal gewesen, da die Frage gestellt wurde, erscheint die Frage noch früh in Google-Ergebnisse auf, und diese Methode direkt gebaut in die Python-Syntax (keine Importe oder benutzerdefinierte Klassen erforderlich). Es ist eine einfache shortcut conditional statement. Sie sind intuitiv zu lesen (wenn sie einfach gehalten werden) und es ist oft hilfreich, dass sie short-circuit.

+0

Während Antworten immer geschätzt werden, wurde diese Frage vor 5 Jahren gestellt und beantwortet und hatte bereits eine akzeptierte Lösung. Es hilft auch, einige Informationen darüber zu geben, wie Ihr Code das vorliegende Problem löst. Bitte geben Sie einige [Kontext um Ihre Antwort] (https://meta.stackexchange.com/a/148274) und den [Hilfeartikel] (http://stackoverflow.com/help/how-to-answer) für Informationen darüber, wie man gute Antworten schreibt :) –