दिलचस्प पोस्ट
एंड्रॉइड: स्मृति आवंटित करने में विफल रहा आप HQL में एक सीमा क्वेरी कैसे करते हैं? संबंधित मूल्यों के साथ स्विफ्ट एन्हियम की समानता का परीक्षण कैसे करें परिवर्तित सूची <पूर्णांक> सूची <स्ट्रिंग> सामान्य लैम्ब्डा सी ++ 14 में कैसे काम करता है? एक इकाई संबंध मॉडल और एक संबंधपरक मॉडल के बीच अंतर क्या है? गिथूब को प्रतिबद्ध करने पर गिट विफल हो जाता है सेवा एप्लिकेशन और Google Analytics API V3: सर्वर-टू-सर्वर OAuth2 प्रमाणीकरण? पायथन यूटीएफ -16 सीएसवी रीडर एक खिड़की सेवा शुरू करें और सीएमडी लॉन्च करें सी ++ में आप किस प्रकार की एन्यूम का उपयोग कर रहे हैं? जावास्क्रिप्ट ऑब्जेक्ट में गतिशील रूप से नामित गुण जोड़ना संभव है? वापस संदर्भ नहीं वापस संदर्भ संदर्भ पायथन re.sub दूरस्थ यूआरएल से कनेक्ट करना जिसके लिए जावा का इस्तेमाल करने के लिए प्रमाणीकरण की आवश्यकता होती है मेरी स्पिनर जीआईएफ स्टॉप करते हैं, जबकि jQuery के एजेक्स कॉल चल रहा है?

पायथन __str__ बनाम __unicode__

क्या आप को __str__() बनाम __unicode__() कार्यान्वयन के लिए एक अजगर सम्मेलन है। मैंने कक्षाओं को __unicode__() अधिक से अधिक __unicode__() अधिक बार देखा है लेकिन यह सुसंगत नहीं दिखता है। क्या कोई विशिष्ट नियम हैं, जब किसी अन्य के विरुद्ध एक को लागू करना बेहतर होता है? क्या यह आवश्यक है कि दोनों को कार्यान्वित किया जाए?

वेब के समाधान से एकत्रित समाधान "पायथन __str__ बनाम __unicode__"

__str__() पुरानी विधि है – यह बाइट्स रिटर्न करती है __unicode__() नई, पसंदीदा विधि है – यह अक्षर देता है नाम थोड़ा भ्रमित हैं, लेकिन 2.x में हम संगतता कारणों के लिए उनके साथ फंस रहे हैं। आम तौर पर, आपको अपने स्ट्रिंग फॉर्मेटिंग को __unicode__() में रखना चाहिए, और एक स्टब __str__() विधि बनाएं:

 def __str__(self): return unicode(self).encode('utf-8') 

3.0 में, str में वर्ण होते हैं, इसलिए उसी विधियों का नाम __bytes__() और __str__() । ये अपेक्षा के अनुरूप व्यवहार करते हैं

अगर मुझे किसी विशेष श्रेणी के लिए सूक्ष्म-अनुकूलन __unicode__ विशेष रूप से परवाह नहीं थी, तो मैं हमेशा ही __unicode__ ही कार्यान्वित __unicode__ , क्योंकि यह अधिक सामान्य है। जब मैं इस तरह के मिनट के प्रदर्शन के मुद्दों (जो अपवाद है, न कि नियम) के बारे में परवाह करता हूं, तो __str__ केवल (जब मैं साबित कर सकता हूं कि कभी भी स्ट्रैटेड आउटपुट में गैर-एएससीआईआई वर्ण नहीं होगा) या दोनों (जब दोनों संभव हो) हो, मदद हो सकती है।

ये मुझे लगता है कि ठोस सिद्धांत हैं, लेकिन व्यवहार में यह बहुत ही सामान्य ज्ञान है कि यह साबित करने के प्रयास किए बिना एएससीआईआई वर्णों के अलावा कुछ भी नहीं होगा (जैसे स्ट्रैडफार्म फॉर्म में केवल अंक, विराम चिह्न, और शायद छोटा एएससीआईआई नाम 😉 जिसमें यदि यह सीधे "बस __str__ " दृष्टिकोण पर आगे बढ़ने के लिए काफी विशिष्ट है (लेकिन यदि मैंने एक प्रोग्रामिंग टीम के साथ काम किया है, तो उस से बचने के लिए एक स्थानीय दिशानिर्देश प्रस्तावित किया गया है, मुझे प्रस्ताव पर +1 करना होगा, क्योंकि इन मामलों में गलती करना आसान है और "समयपूर्व अनुकूलन प्रोग्रामिंग में सभी बुराइयों की जड़ है" 😉

दुनिया को कम होने के साथ, संभावना है कि आपके सामने आने वाली किसी भी स्ट्रिंग में यूनिकोड अंततः शामिल होंगे। इसलिए किसी भी नए ऐप्स के लिए, आपको कम से कम __unicode__() प्रदान करना चाहिए। चाहे आप __str__() को भी ओवरराइड __str__() तो फिर स्वाद का मामला है।

यदि आप अजगर 2 और अजगर 3 दोनों में Django में काम कर रहे हैं, तो मैं python_2_unicode_compatible डेकोरेटर की सलाह देता हूं:

पायथन 2 और 3 पर काम करने वाले स्ट्रिंग () और यूनिकोड () विधियों को परिभाषित करने के लिए Django एक आसान तरीका प्रदान करता है: आपको एक स्ट्र () विधि लौटने वाले टेक्स्ट को परिभाषित करना होगा और पायथन 2_ऑनिकोडा-संगत () डेकोरेटर को लागू करना होगा।

जैसा कि पहले टिप्पणियों में एक और जवाब के लिए बताया गया है, भविष्य के कुछ संस्करण। कुत्ते भी इस डेकोरेटर का समर्थन करते हैं। मेरे सिस्टम पर, मुझे अजगर 2 के लिए एक नया भविष्य मॉड्यूल स्थापित करने और python3 के लिए भविष्य स्थापित करने की आवश्यकता है। उसके बाद, यहां एक कार्यात्मक उदाहरण है:

 #! /usr/bin/env python from future.utils import python_2_unicode_compatible from sys import version_info @python_2_unicode_compatible class SomeClass(): def __str__(self): return "Called __str__" if __name__ == "__main__": some_inst = SomeClass() print(some_inst) if (version_info > (3,0)): print("Python 3 does not support unicode()") else: print(unicode(some_inst)) 

यहां उत्पादन का उदाहरण दिया गया है (जहां venv2 / venv3 वर्चुअलएनिव उदाहरण हैं):

 ~/tmp$ ./venv3/bin/python3 demo_python_2_unicode_compatible.py Called __str__ Python 3 does not support unicode() ~/tmp$ ./venv2/bin/python2 demo_python_2_unicode_compatible.py Called __str__ Called __str__