Recentemente ho fatto un sacco di programmazione musicale basata, e come tale ritrovo a fare questo genere di cose molto a che fare con i metadati mancante in alcuni brani:String formattazione in pitone
default = {'title': 'Unknown title', 'artist': 'unknown Artist'}
default.update(song)
print '{title} - {artist}'.format(**default)
C'è un modo più pulito per fare questo? Ho provato imperativi __missing__ in questo modo, ma mancano ancora le chiavi gettano un KeyError:
class Song(dict):
# dictionary with some nice stuff to make it nicer
def __missing__(self, key):
return 'Unknown {key}'.format(key = key)
Edit: Scusa avrei dovuto essere più chiaro, in sostanza il seguente deve lavorare.
s = Song()
print '{notAKey}'.format(s)
Un paio di persone hanno sottolineato che i ** s non sono necessari.
Modifica 2: Ho "risolto" il mio problema, almeno con mia soddisfazione. È discutibile se questo sia più o meno pulito, ma funziona per me.
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)
Così il seguente tornerà 'notAKey Unknown'
k = Song()
print k.format('{notAKey}')
Solo una piccola raccomandazione: sembra che tu stia facendo un'applicazione per l'uso quotidiano e magari la distribuisci. Se lo farai, allora dovresti iniziare a usare [gettext] (http://docs.python.org/library/gettext.html) - ti risparmierai molto dopo. – nagisa