Recientemente he estado haciendo un montón de programación basada en la música, y como tal encuentro haciendo este tipo de cosas mucho que tratar con falta de metadatos en algunas canciones:formato de cadenas en Python
default = {'title': 'Unknown title', 'artist': 'unknown Artist'}
default.update(song)
print '{title} - {artist}'.format(**default)
¿Hay una forma más limpia de hacer esto? He intentado preponderantes con __missing__ como tal pero falta claves todavía lanzan una KeyError:
class Song(dict):
# dictionary with some nice stuff to make it nicer
def __missing__(self, key):
return 'Unknown {key}'.format(key = key)
Edit: Lo siento que debería haber sido más claro, básicamente, lo siguiente debe trabajar.
s = Song()
print '{notAKey}'.format(s)
Un par de personas han señalado que los ** no son necesarios.
Editar 2: He "resuelto" mi problema, al menos para mi satisfacción. Es discutible si esto es más limpio o no, pero funciona para mí.
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)
Así que el siguiente volverá 'notAKey Desconocido'
k = Song()
print k.format('{notAKey}')
Solo una pequeña recomendación: Parece que está haciendo una aplicación para uso diario, y quizás la distribuya. Si lo desea, entonces debería comenzar a usar [gettext] (http://docs.python.org/library/gettext.html); se ahorrará muchos problemas más adelante. – nagisa