Форматирование строк в python

В последнее время я много занимаюсь программированием на основе музыки, и поэтому часто делаю подобные вещи, чтобы иметь дело с отсутствующими метаданными в некоторых песнях:

default = {'title': 'Unknown title', 'artist': 'unknown Artist'}
default.update(song)
print '{title} - {artist}'.format(**default)

Есть ли более чистый способ сделать это? Я попытался переопределить __missing__, но отсутствующие ключи все равно вызывают ошибку KeyError:

class Song(dict):
    # dictionary with some nice stuff to make it nicer

    def __missing__(self, key):
        return 'Unknown {key}'.format(key = key)

Edit: Извините, я должен был быть более ясным, в основном следующее должно работать.

s = Song()
print '{notAKey}'.format(s)

Несколько человек указали, что ** s не нужны .

Править 2: Я «решил» свою проблему, по крайней мере, к моему удовлетворению. Это спорный вопрос, является ли это чище, но это работает для меня.

from string import Formatter

class DefaultFormatter(Formatter):

    def get_value(self, key, args, kwargs):
        # Try standard formatting, then return 'unknown key'

        try:
            return Formatter.get_value(self, key, args, kwargs)
        except KeyError:
            return kwargs.get(key, 'Unknown {0}'.format(key))

class Song(dict):

    def format(self, formatString):
        # Convenience method, create a DefaultFormatter and use it

        f = DefaultFormatter()
        return f.format(formatString, **self)

Таким образом, следующий код вернет 'Unknown notAKey'

k = Song()
print k.format('{notAKey}')
5
задан Klohkwherk 21 August 2011 в 17:43
поделиться