2012-11-09 7 views
9

Tutti i miei django-modelli hanno Unicode funzioni, al momento questi tendono ad essere scritto in questo modo:Django: Più Pythonic __unicode__

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

Tuttavia, il codice come un Pythonista, a http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#string-formatting ricorda che self.__dict__ è un dizionario, e come tale di cui sopra può essere semplificata per:

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

Questo funziona, tranne che per il "base.name", perché python prova a guardare in alto self.__dict__['base.name'] che non riesce, mentre self.b ase.name funziona.

C'è un modo elegante per fare questo lavoro, anche se è necessario seguire stranieri-key-relazioni?

risposta

8

% formattazione di stringhe non supporta l'accesso attributo, ma format (dal 2,6) fa:

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

Eccellente! Perché questi due metodi di formattazione delle stringhe? Ci sono alcune situazioni in cui .format() non dovrebbe essere usato, o dovrei semplicemente cambiarlo per usarlo sempre per coerenza? – Agrajag

+1

@Agrajag 'format' è stato aggiunto in 2.6, quindi l'unica ragione per usare la formattazione'% 'è se stai scrivendo codice per vecchi sistemi o se vuoi far apparire il tuo codice come C. – ecatmur