2014-05-22 28 views
2

我使用庫「suds」與SOAP服務器進行通信。 請求已成功完成後,我得到的答案:奇怪的Python類型「文本」?

answer = client.invoke('RetrieveBLABLAObject', modelthings) 

這個答案是請求對象的不同領域的結構。每個字段是由「字符串」參數「_type」和參數「value」組成的結構,可能有不同的類型。

answer [key] [value] - 返回參數「value」的值。但是在調試模式下(我使用Python 2.7.6和PyCharm),它顯示出該值的類型爲「文本」。不是「str」,而不是「unicode」,而是「文本」。

如果我通過

isinstance(obj[cur_key]['value'], unicode) 

檢查一下它讓我發現,它計數該文本爲「統一」。但是,如果我用同一個身體使用Unicode進行比較,則返回false:

if obj[cur_key]['value'] != u'String that I know is there': 
    print("true") #it is printing, but it shouldn't 

爲什麼出現這種情況?我如何將「文本」轉換爲unicode? 我試過

obj[cur_key]['value'].decode('utf-8') 

它與例外。我如何處理這種「文本」類型?

+0

'repr(obj [cur_key] ['value'])'給了你什麼?什麼例外? – geoffspear

+0

@Martijn是對的,它是子類,和他描述的一切。無論如何,謝謝您的幫助。 – Arkady

回答

8

您正在尋找最有可能的unicode的子類。我認爲你在這裏有一個suds.sax.text.Text()的實例。由於這是子類,因此isinstance(obj, unicode)爲真。

它的值是已經 unicode字符串,因此解碼將觸發一個隱含編碼先用ASCII,這的確會失敗。

您可以通過簡單地使用轉換爲Unicode類型:

unicode(obj[cur_key]['value']) 

但考慮到值仍然可以是XML逃脫; .unescape()方法會返回一個未轉義的版本(如果該值未經過轉義,它將返回self)。

當與另一個字符串進行比較時,確保它們是,確切地說相等。 Unicode值可以包含許多「隱藏」值,例如零寬度字符或組合字符,這些字符也可以在合併的表單中表示。使用repr(value)可以獲得使這些代碼點更明顯的轉義表示。

suds.sax.text.Text()類沒有特殊情況的平等的測試,所以你!=測試將工作一樣一樣的,如果值是unicode字符串,而不是子類。