2012-11-09 15 views
9

मेरे सभी Django मॉडल यूनिकोड कार्य, इस समय इन इस तरह लिखा हो जाते हैं:Django: अधिक pythonic __unicode__

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

हालांकि, कोड एक Pythonista की तरह, http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#string-formatting बिंदुओं पर बाहर है कि self.__dict__ एक शब्दकोश है, और के रूप में ऐसी ऊपर करने के लिए सरल किया जा सकता:

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

यह काम करता है "base.name" के लिए छोड़कर, क्योंकि अजगर self.__dict__['base.name'] जो विफल रहता है को देखने के लिए कोशिश करता है, जबकि self.b ase.name काम करता है।

क्या यह काम करने का एक शानदार तरीका है, भले ही आपको विदेशी-संबंधों का पालन करने की आवश्यकता हो?

उत्तर

8

% स्ट्रिंग स्वरूपण विशेषता का उपयोग का समर्थन नहीं करता है, लेकिन format (2.6 के बाद से) करता है:

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

बहुत बढ़िया! स्ट्रिंग-स्वरूपण के इन दोहरी तरीकों का क्यों? क्या ऐसी कुछ स्थितियां हैं जहां .format() का उपयोग नहीं किया जाना चाहिए, या क्या मुझे हमेशा स्थिरता के लिए इसका उपयोग करने के लिए बदलना चाहिए? – Agrajag

+1

@Agrajag 'format' 2.6 में जोड़ा गया था, इसलिए'% 'स्वरूपण का उपयोग करने का एकमात्र कारण यह है कि यदि आप पुराने सिस्टम के लिए कोड लिख रहे हैं या यदि आप अपना कोड सी की तरह दिखाना चाहते हैं। – ecatmur