String.format() с необязательными заполнителями

У меня есть следующий код Python (я использую Python 2.7.X):

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

Я получаю исключение KeyError, потому что "средний" не указан (это ожидается). Тем не менее, я хочу, чтобы все эти заполнители были необязательными. Если эти именованные параметры не указаны, я ожидаю, что заполнители будут удалены. Поэтому строка, напечатанная выше, должна быть:

John,,Doe

Есть ли встроенная функциональность, чтобы сделать эти заполнители необязательными или требуется более подробная работа? Если последнее, если кто-то может показать мне самое простое решение, я бы его оценил!

Ответ 1

Вот один из вариантов:

from collections import defaultdict

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

Ответ 2

Здесь другой параметр, который использует оператор интерполяции строк %:

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

В качестве альтернативы, если вы предпочитаете использовать более современный метод str.format(), следующее будет работать, но будет менее автоматическим в том смысле, что вы будете явно определять все возможные заполнители заранее (хотя вы можете изменить DataDict.placeholders на лету при желании):

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

Ответ 3

"It does{cond} contain the the thing.".format(cond="" if condition else " not")

Думаю, я бы добавил это, потому что это была функция, так как вопрос был задан, вопрос по-прежнему появляется в начале результатов Google, и этот метод встроен непосредственно в синтаксис python (не требуется импорт или пользовательские классы). Это простой сокращенный условный оператор. Они интуитивно понятны для чтения (когда их просто просты), и часто полезно, чтобы они short-circuit.