2012-10-15 32 views
7

Sau đây là từ mã nguồn django (Django-1.41/django/utils/encoding.py);Tôi bị nhầm lẫn bởi mã này

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

Câu hỏi của tôi là: Trong trường hợp này s là trường hợp ngoại lệ?
khi s là một thể hiện của Ngoại lệ và s không có thuộc tính str hoặc repr. Tình trạng này xảy ra hơn. Thê nay đung không?

+0

Tôi có thể viết 'tăng "a_string" 'bằng Python? –

+0

Đối số duy nhất để tăng chỉ ra ngoại lệ được nêu ra. Đây phải là một trường hợp ngoại lệ hoặc một lớp ngoại lệ (một lớp xuất phát từ Ngoại lệ). – Yejing

Trả lời

3

s sẽ là ngoại lệ nếu ai đó gọi hàm force_unicode với một lớp con Ngoại lệ và thông báo bao gồm các ký tự unicode.

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

Nếu mã trong khối try thất bại thì không có gì sẽ được giao cho s, vì vậy s sẽ vẫn những gì các chức năng ban đầu được gọi với.

Kể từ Exception thừa hưởng từ object, và object đã có __unicode__ phương pháp kể từ Python 2.5, nó có thể là trường hợp đó mã này tồn tại cho Python 2.4 và bây giờ đã lỗi thời.

UPDATE: Sau khi mở một yêu cầu kéo, mã này hiện đã được loại bỏ khỏi nguồn Django: https://github.com/django/django/commit/ce1eb320e59b577a600eb84d7f423a1897be3576

+0

Cảm ơn, tôi nghĩ rằng khi s là một trường hợp ngoại lệ, và s không có thuộc tính __str__ hoặc __repr__. Tình trạng này xảy ra hơn. Là đúng. – Yejing

+0

Chỉ khi thư có các ký tự unicode. –

+0

Tôi nghĩ rằng điều này chỉ hoạt động đối với các phiên bản của Python trước 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

Nhưng trong s = unicode (str (s), encoding, errors). str (s) sẽ trả về một chuỗi. Vì vậy, s sẽ là u'No way 'sau tuyên bố này. – Yejing