2012-10-15 13 views
7

Das folgende ist aus dem Django-Quellcode (Django-1.41/django/utils/encoding.py);Ich bin verwirrt durch diesen Code

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]) 

Meine Frage ist: In diesem Fall wird s eine Instanz Ausnahme sein?
wenn s eine Instanz von Exception ist und s weder das Attribut str oder rep hat. Dann passiert diese Situation. Ist das richtig?

+0

Kann ich schreiben 'raise "a_string"' in Python? –

+0

Das einzige Argument zum Erhöhen gibt die Ausnahme an, die ausgelöst werden soll. Dies muss entweder eine Ausnahmeinstanz oder eine Ausnahmeklasse sein (eine Klasse, die von Exception abgeleitet ist). – Yejing

Antwort

3

s wird eine Ausnahme sein, wenn jemand die force_unicode-Funktion mit einer Unterklasse von Exception aufgerufen hat und die Nachricht Unicode-Zeichen enthält.

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

Wenn der Code im try Block versagt, dann wird nichts s zugewiesen werden, so s bleiben, was die Funktion zunächst aufgerufen wurde.

Seit Exception erbt von object und object hat die __unicode__ Methode seit Python 2.5, hat es der Fall sein könnte, dass dieser Code für Python existierte 2.4 und ist mittlerweile veraltet.

UPDATE: Nach der Pull-Anforderung geöffnet wird, hat dieser Code jetzt aus der Django Quelle entfernt: https://github.com/django/django/commit/ce1eb320e59b577a600eb84d7f423a1897be3576

+0

Danke, ich denke, wenn s eine Instanz von Exception ist, und s weder __str__ oder __repr__ Attribut haben. Dann passiert diese Situation. Ist richtig. – Yejing

+0

Nur wenn die Nachricht Unicode-Zeichen enthält. –

+0

Ich denke, das funktioniert nur für Versionen von Python vor 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

Aber in s = Unicode (Str (s), Codierung, Fehler). str (s) gibt eine Zeichenfolge zurück. So wird es nach dieser Aussage nicht mehr sein. – Yejing

Verwandte Themen