2012-11-09 7 views
9

Alle meine django-Modelle haben Unicode Funktionen, zur Zeit neigen diese wie folgt geschrieben werden:Django: Mehr pythonic __unicode__

def __unicode__(self): 
    return u'Unit: %s -- %s * %f' % (self.name, self.base.name, self.mul) 

jedoch Code wie ein Pythonista, bei http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#string-formatting weist darauf hin, dass self.__dict__ ist ein Wörterbuch, und als solche die oben vereinfacht werden kann:

def __unicode__(self): 
    return u'Unit: %(name)s -- %(base.name)s * %(mul)f' % self.__dict__ 

Dies funktioniert, mit Ausnahme der „base.name“, weil python zu sehen self.__dict__['base.name'] versucht, die zwar self.b versagt ase.name funktioniert.

Gibt es eine elegante Möglichkeit, dies zu erreichen, selbst wenn Sie den Fremdschlüsselbeziehungen folgen müssen?

Antwort

8

% Zeichenfolge Formatierung nicht unterstützt Attribut Zugriff, aber format (seit 2.6) tut:

def __unicode__(self): 
    return u'Unit: {name:s} -- {base.name:s} * {mul:f}'.format(**self.__dict__) 
+0

Excellent! Warum diese zwei Methoden der String-Formatierung? Gibt es Situationen, in denen .format() nicht verwendet werden sollte, oder sollte ich nur ändern, um dies immer aus Konsistenzgründen zu verwenden? – Agrajag

+1

@Agrajag 'format' wurde in 2.6 hinzugefügt, der einzige Grund,'% 'Formatierung zu verwenden, ist, wenn Sie Code für alte Systeme schreiben oder wenn Sie Ihren Code wie C aussehen lassen wollen. – ecatmur