В последнее время я много занимаюсь программированием на основе музыки, и поэтому я часто занимаюсь такими вещами, чтобы справиться с отсутствующими метаданными в некоторых песнях:
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)
Редактировать: Извините, я должен был быть более ясным, в основном следующее должно работать.
s = Song()
print '{notAKey}'.format(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}')