2012-10-15 129 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會是異常的一個實例嗎?
當s是Exception的一個實例時,s不具有str或repr屬性。比這種情況發生。這是正確的嗎?

+0

我可以寫'養 「在此處a_string」'在Python: 打開拉請求後,該代碼現在已經從Django的源刪除? –

+0

引發的唯一參數表示要引發的異常。這必須是異常實例或異常類(從Exception派生的類)。 – Yejing

回答

3

s將是一個例外,如果有人用Exception的子類調用force_unicode函數並且該消息包含unicode字符。

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

如果try塊中的代碼失敗,那麼什麼都不會被分配到s,所以S也會一直是函數最初調用。

由於Exceptionobject,並且object繼承有過__unicode__方法因爲Python 2.5,則可能是存在的Python 2.4的代碼,現在已經過時的情況。

UPDATE:https://github.com/django/django/commit/ce1eb320e59b577a600eb84d7f423a1897be3576

+0

謝謝,我想當s是Exception的一個實例,並且s既沒有__str__也沒有__repr__屬性。比這種情況發生。是對的。 – Yejing

+0

只有消息具有Unicode字符。 –

+0

我認爲這隻適用於2.5之前的Python版本。 –

-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

但是在s = unicode(str(s),encoding,errors)中。 str(s)將返回一個字符串。所以在這個陳述之後,s將會是'不'。 – Yejing