2012-06-13 9 views
12

Mam następujący kod Pythona (używam Python 2.7.X):String.Format() z opcjonalnymi zastępcze

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

dostaję KeyError wyjątek, ponieważ 'middle' nie jest określona (to jest spodziewany). Jednak chcę, aby wszystkie te elementy zastępcze były opcjonalne. Jeśli te nazwane parametry nie są określone, oczekuję usunięcia tych symboli zastępczych. Zatem ciąg drukowane powyżej powinny być:

John,,Doe 

Czy jest zbudowany w funkcjonalności, aby te zastępcze opcjonalne, czy jest jakiś bardziej w pracy głębokości wymagane? Jeśli to drugie, jeśli ktoś mógłby pokazać mi najprostsze rozwiązanie, doceniłbym to!

Odpowiedz

14

Oto jedna opcja:

from collections import defaultdict 

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

Widzę, że używasz 'str'. Co to jest? Edycja: Teraz widzę, że jest to metoda fabryczna, a nie nazwa zmiennej. Fabryka utworzy puste ciągi. –

5

Oto kolejna opcja, która używa operatora interpolacji ciąg %:

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 

Ewentualnie, jeśli wolisz, stosując bardziej nowoczesne metody str.format(), przyszły także po działa, ale jest mniej automatyczny w tym sensie, że wyraźnie zdefiniujesz wszystkie możliwe symbole zastępcze z wyprzedzeniem (mimo że możeszmodyfikowaće-fly w razie potrzeby):

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

Myśl, że mogę dodać to, bo to było cechą skoro padło pytanie, pytanie ciągle pojawia się wcześnie w wynikach Google, a metoda ta jest zbudowana bezpośrednio do składni pythona (nie jest wymagane importowanie ani niestandardowe klasy). To proste shortcut conditional statement. Są intuicyjne w odczycie (jeśli są proste) i często są pomocne, gdy są short-circuit.

+0

Podczas gdy odpowiedzi są zawsze doceniane, to pytanie zostało zadane i udzielono odpowiedzi 5 lat temu i już przyjęto rozwiązanie. Pomaga to również w dostarczeniu informacji o tym, jak twój kod rozwiązuje problem. Podaj [kontekst otaczający twoją odpowiedź] (https://meta.stackexchange.com/a/148274) i zobacz [artykuł pomocy] (http://stackoverflow.com/help/how-to-answer) dla informacje o tym, jak pisać świetne odpowiedzi :) –