2013-05-07 5 views
5

मैं पायथन संस्करण का उपयोग कर रहा हूं: 2.7.3।पायथन की स्ट्रिंग और यूनिकोड जबरन/जादू कार्य कैसे काम करते हैं?

अजगर में, हम str और unicode हमारे कस्टम वर्गों पर के व्यवहार को परिभाषित करने के जादू तरीकों __str__ और __unicode__ का उपयोग करें:

>>> class A(object): 
    def __str__(self): 
    print 'Casting A to str' 
    return u'String' 
    def __unicode__(self): 
    print 'Casting A to unicode' 
    return 'Unicode' 


>>> a = A() 
>>> str(a) 
Casting A to str 
'String' 
>>> unicode(a) 
Casting A to unicode 
u'Unicode' 

व्यवहार चलता है कि __str__ और __unicode__ से रिटर्न मान पर मजबूर कर रहा है या तो str या unicode किस जादू विधि को चलाया जाता है इसके आधार पर।

हालांकि, अगर हम ऐसा करते हैं:

>>> class B(object): 
    def __str__(self): 
    print 'Casting B to str' 
    return A() 
    def __unicode__(self): 
    print 'Casting B to unicode' 
    return A() 


>>> b = B() 
>>> str(b) 
Casting B to str 

Traceback (most recent call last): 
    File "<pyshell#47>", line 1, in <module> 
    str(b) 
TypeError: __str__ returned non-string (type A) 
>>> unicode(b) 
Casting B to unicode 

Traceback (most recent call last): 
    File "<pyshell#48>", line 1, in <module> 
    unicode(b) 
TypeError: coercing to Unicode: need string or buffer, A found 

str.mro() और unicode.mro() कॉलिंग का कहना है कि दोनों basestring की उपवर्गों हैं। हालांकि, __unicode__buffer ऑब्जेक्ट्स को लौटने की भी अनुमति देता है, जो सीधे object से प्राप्त होता है और basestring से प्राप्त नहीं होता है।

तो, मेरा सवाल यह है कि वास्तव में क्या होता है जब str और unicode कहा जाता है? __str__ और __unicode__ पर str और unicode पर उपयोग के लिए वापसी मूल्य आवश्यकताएं क्या हैं?

+0

आपको यह पता लगाने के लिए स्रोत कोड को देखने की आवश्यकता हो सकती है – Eric

उत्तर

4

हालांकि, __unicode__ भी बफर वस्तुओं, जो सीधे वस्तु और basestring से विरासत में नहीं आता के लौटने की अनुमति देता है।

यह सही नहीं है। unicode() एक स्ट्रिंग या एक बफर परिवर्तित कर सकते हैं। यह डिफ़ॉल्ट एन्कोडिंग का उपयोग करके पारित तर्क को यूनिकोड में परिवर्तित करने का एक "सबसे अच्छा प्रयास" है (यही कारण है कि यह कोरिंग) कहता है। यह हमेशा एक यूनिकोड वस्तु वापस करेगा।

तो, मेरा सवाल यह है कि, वास्तव में क्या होता है जब स्ट्र और यूनिकोड कहा जाता है? __str__ और __unicode__ पर स्ट्र और यूनिकोड में उपयोग के लिए वापसी मान आवश्यकताएं क्या हैं?

__str__ वस्तु के अनौपचारिक, मानव-अनुकूल स्ट्रिंग प्रतिनिधित्व को वापस करना चाहिए। यह तब कहा जाता है जब कोई व्यक्ति आपकी ऑब्जेक्ट पर str() का उपयोग करता है, या जब आपका ऑब्जेक्ट प्रिंट स्टेटमेंट का हिस्सा होता है।

__unicode__ हमेशा unicode ऑब्जेक्ट वापस करना चाहिए। यदि यह विधि परिभाषित नहीं की गई है, तो __str__ कहा जाता है और फिर परिणाम यूनिकोड के लिए मजबूर होते हैं (उन्हें unicode() पर पास करके)।

आपके दूसरे उदाहरण में, आप अमान्य वस्तुओं को वापस कर रहे हैं, यही कारण है कि आप त्रुटि संदेश देख रहे हैं। साइड इफेक्ट के कारण आपका पहला उदाहरण __unicode__ के लिए काम करता प्रतीत होता है, लेकिन यह सही ढंग से भी लिखा नहीं गया है।

data model प्रलेखन का अनुभाग इन "जादू विधियों" पर अधिक जानकारी और विवरण के लिए पढ़ने योग्य है।

+0

यह बताता है कि क्या वापस किया जाना चाहिए, लेकिन सवाल (कम से कम मेरा इरादा था) आप कुछ और क्यों नहीं लौट सकते हैं? –

+0

ये "जादू" विधियों के साथ उनके साथ जुड़े एक निश्चित प्रोटोकॉल हैं, यही कारण है कि आप अप्रत्याशित परिणाम प्राप्त करते हैं यदि आप अपेक्षा की अपेक्षा के अलावा कुछ और लौटते हैं क्योंकि वे ऑब्जेक्ट्स के _डेट मॉडल_ का हिस्सा हैं। –

संबंधित मुद्दे