2012-11-09 10 views
9

Wszystkie moje django-modele mają unicode funkcje, w tej chwili te wydają się być napisane tak:Django: Więcej pythonic __unicode__

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

Jednak Kod Niczym Pythonista na http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#string-formatting wskazuje, że self.__dict__ jest słownikiem i jako takie powyższego można uprościć do:

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

to działa, z wyjątkiem „base.name”, bo python próbuje patrzeć self.__dict__['base.name'] który zawiedzie, a self.b ase.name działa.

Czy istnieje elegancki sposób na wykonanie tej pracy, nawet jeśli zachodzi potrzeba obcowania z kluczowymi związkami?

Odpowiedz

8

% formatowanie ciąg nie obsługuje dostęp atrybutu, ale format (od 2.6) robi:

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

Doskonała! Dlaczego te dwie metody formatowania ciągów znaków? Czy są pewne sytuacje, w których nie należy używać formuły .format(), czy też powinienem zmienić tak, aby zawsze używać tego dla spójności? – Agrajag

+1

@Agrajag 'format' został dodany w 2.6, więc jedynym powodem używania formatu'% 'jest pisanie kodu dla starych systemów lub jeśli chcesz, aby twój kod wyglądał jak C. – ecatmur