2012-10-15 18 views
7

यह निम्नलिखित django स्रोत कोड (Django-1.41/django/utils/encoding.py) से है;मैं इस कोड से उलझन में हूं

try: 
    s = unicode(str(s), encoding, errors) 
except UnicodeEncodeError: 
    if not isinstance(s, Exception): 
     raise 

    # If we get to here, the caller has passed in an Exception 
    # subclass populated with non-ASCII data without special 
    # handling to display as a string. We need to handle this 
    # without raising a further exception. We do an 
    # approximation to what the Exception's standard str() 
    # output should be. 
    s = u' '.join([force_unicode(arg, encoding, strings_only, 
     errors) for arg in s]) 

मेरा प्रश्न है: किस मामले में s अपवाद का एक उदाहरण होगा?
जब एस अपवाद का एक उदाहरण है, और उसके पास न तो str या repr विशेषता है। इस स्थिति की तुलना में। क्या यह सही है?

+0

मैं अजगर में लिख सकते हैं 'उठाने" a_string "': एक पुल अनुरोध खोलने के बाद, इस कोड को अब Django स्रोत से हटा दिया गया है? –

+0

उठाने का एकमात्र तर्क उठाए जाने के अपवाद को इंगित करता है। यह या तो एक अपवाद उदाहरण या अपवाद वर्ग (एक वर्ग जो अपवाद से निकला है) होना चाहिए। – Yejing

उत्तर

3

s अपवाद होगा यदि किसी ने force_unicode फ़ंक्शन को अपवाद के उप-वर्ग के साथ बुलाया है और संदेश में यूनिकोड वर्ण शामिल हैं।

s = Exception("\xd0\x91".decode("utf-8")) 
# this will now throw a UnicodeEncodeError 
unicode(str(s), 'utf-8', 'strict') 

try ब्लॉक में कोड में विफल रहता है तो कुछ भी नहीं s को सौंपा जाएगा, इसलिए रों क्या समारोह शुरू में साथ बुलाया गया था रहेगी। object, और object से

Exception के बाद से inherits __unicode__ विधि पायथन 2.5 के बाद से, यह मामला है कि इस कोड अजगर 2.4 के लिए अस्तित्व में है और अब अप्रचलित है हो सकता है पड़ा है।

अद्यतन: https://github.com/django/django/commit/ce1eb320e59b577a600eb84d7f423a1897be3576

+0

धन्यवाद, मुझे लगता है कि जब एस अपवाद का एक उदाहरण है, और उसके पास __str__ या __repr__ विशेषता नहीं है। इस स्थिति की तुलना में। सही है – Yejing

+0

केवल अगर संदेश में यूनिकोड वर्ण हैं। –

+0

मुझे लगता है कि यह केवल 2.5 से पहले पायथन के संस्करणों के लिए काम करता है। –

-1
>>> from django.utils.encoding import force_unicode 
>>> force_unicode('Hello there') 
u'Hello there' 
>>> force_unicode(TypeError('No way')) # In this case 
u'No way' 
+0

लेकिन एस = यूनिकोड (str), एन्कोडिंग, त्रुटियों में)। str (एस) एक स्ट्रिंग वापस कर देगा। इस कथन के बाद आप 'कोई रास्ता नहीं' होंगे। – Yejing

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