2011-08-16 11 views
35

किसी को भी एक विचार है, क्यों इस अजगर 3.2 कोडपायथन में एक स्ट्रिंग के अपवाद परिवर्तित 3

try:  
    raise Exception('X') 
except Exception as e: 
    print("Error {0}".format(str(e))) 

समस्या के बिना काम करता है (विंडोज़ में यूनिकोड एन्कोडिंग के अलग शैल: /) है, लेकिन इस

try:  
    raise Exception('X') 
except Exception as e: 
    print("Error {0}".format(str(e, encoding = 'utf-8'))) 

फेंकता टाइप एरर: स्ट्रिंग को स्ट्रिंग: बाइट्स, बाइटियर या बफर-जैसी ऑब्जेक्ट की आवश्यकता है, अपवाद मिला?

कस्टम एन्कोडिंग के साथ एक स्ट्रिंग में त्रुटि को कैसे परिवर्तित करें?

संपादित

यह या तो काम करता है नहीं है, अगर वहाँ संदेश में \ u2019 है:

try:  
    raise Exception(msg) 
except Exception as e: 
    b = bytes(str(e), encoding = 'utf-8') 
    print("Error {0}".format(str(b, encoding = 'utf-8'))) 

लेकिन क्यों str नहीं कर सकते हैं() बाइट्स आंतरिक रूप से एक अपवाद परिवर्तित?

+2

आप 'str (ई) .encode ('utf-8')' कोशिश की? – agf

+1

@agf स्वयं यह स्ट्रिंग के बजाय बाइट्स देता है।मैं इसे बाइट्स (स्ट्र (ई), एन्कोडिंग = 'यूटीएफ -8' के प्रतिस्थापन के रूप में उपयोग कर सकता हूं), लेकिन मुझे हमेशा दूसरे रूपांतरण बाइट्स => str –

+0

"स्ट्रेट() बाइट्स में क्यों परिवर्तित नहीं किया जा सकता है" - यह कैसे होगा पता लगाने के लिए कौन सी एन्कोडिंग पता है? साथ ही, आपका नया कोड .format (str (e)) के समतुल्य है – hamstergene

उत्तर

31

पायथन 3.x, str(e) में किसी भी Exception को स्ट्रिंग में कनवर्ट करने में सक्षम होना चाहिए, भले ही इसमें यूनिकोड वर्ण हों।

तो जब तक अपने अपवाद वास्तव में रिटर्न अपने कस्टम __str__() विधि में एक UTF-8 एन्कोडेड बाइट सरणी, str(e, 'utf-8') अपेक्षा के अनुरूप (यह एक UTF-8 एन्कोडेड बाइट सरणी के रूप में रैम में एक 16bit यूनिकोड वर्ण स्ट्रिंग की व्याख्या करने की कोशिश करेगा काम नहीं करेगा ...)

मेरा अनुमान है कि आपकी समस्या str() नहीं है, लेकिन print() (यानी चरण जो पाइथन यूनिकोड स्ट्रिंग को आपके कंसोल पर डंप किया जाता है) में परिवर्तित करता है। समाधान के लिए यह उत्तर देखें: Python, Unicode, and the Windows console

+0

वास्तव में, मुझे शुरुआत में * यूनिकोड एन्कोडर त्रुटि: 'आकर्षण' कोडेक चरित्र को एन्कोड नहीं कर सकता ... * विन 7 के फ्रेंच संस्करण के तहत खोल में। यह उपयोग करने के बजाय स्पष्ट रूप से सब कुछ utf-8 में परिवर्तित करने के लिए अधिक पोर्टेबल लग रहा था कुछ कस्टम, ओएस-निर्भर रैपर। –

4

पायथन 3, string में एन्कोडिंग के रूप में ऐसी विशेषता नहीं है। यह हमेशा आंतरिक रूप से यूनिकोड है।

s = "Error {0}".format(str(e)) # string 
utf8str = s.encode("utf-8") # byte array, representing utf8-encoded text 
+0

spec के अनुसार नहीं: http://docs.python.org/py3k/library/functions.html#str –

+0

यह कन्स्ट्रक्टर के लिए सिर्फ एक पैरामीटर है, जो इसे एन्कोडिंग मानते हुए यूनिकोड को बाइट सरणी को डीकोड करने का कारण बनता है। – hamstergene

+0

तो मैं आपकी प्रतिक्रिया को समझ नहीं पा रहा हूं। क्या आप इसे थोड़ा सा विस्तारित कर सकते हैं? –

7

इस प्रयास करें, यह काम करना चाहिए: एन्कोडेड तार के लिए, वहाँ बाइट सरणियों कर रहे हैं।

try:  
    raise Exception('X') 
except Exception as e: 
    print("Error {0}".format(str(e.args[0])).encode("utf-8")) 

ध्यान में रखते हुए आपके आंतरिक टुपल में केवल एक संदेश है।

+0

यह पहली चीज थी जिसकी मैंने कोशिश की है, हां: * विशेषता त्रुटि: 'अपवाद' ऑब्जेक्ट में कोई विशेषता नहीं है 'संदेश' * –

+0

ओह, आप सही हैं; ऐसा इसलिए है क्योंकि संस्करण> 3 पायथन में तर्क का उपयोग करता है और संदेश नहीं। –

+0

इस नए संस्करण को आजमाएं –

3

पायथन 3 में, आप पहले से ही "यूनिकोड स्पेस" में हैं और एन्कोडिंग की आवश्यकता नहीं है। आप जो हासिल करना चाहते हैं उसके आधार पर, आपको सामान करने से पहले रूपांतरण करना चाहिए।

उदा। आप दिशा

bytes("Error {0}".format(str(e)), encoding='utf-8') 

में bytes() को यह सब में बदल सकते हैं, बल्कि।

0

वहाँ एक संस्करण-अज्ञेयवाद रूपांतरण यहाँ है: इसके लिए

# from the `six` library 
import sys 
PY2 = sys.version_info[0] == 2 
if PY2: 
    text_type = unicode 
    binary_type = str 
else: 
    text_type = str 
    binary_type = bytes 

def exc2str(e): 
    if e.args and isinstance(e.args[0], binary_type): 
     return e.args[0].decode('utf-8') 
    return text_type(e) 

और परीक्षण:

def test_exc2str(): 
    a = u"\u0856" 
    try: 
     raise ValueError(a) 
    except ValueError as e: 
     assert exc2str(e) == a 
     assert isinstance(exc2str(e), text_type) 
    try: 
     raise ValueError(a.encode('utf-8')) 
    except ValueError as e: 
     assert exc2str(e) == a 
     assert isinstance(exc2str(e), text_type) 
    try: 
     raise ValueError() 
    except ValueError as e: 
     assert exc2str(e) == '' 
     assert isinstance(exc2str(e), text_type) 
संबंधित मुद्दे

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