我使用图书馆" suds"与SOAP服务器通信。 请求成功完成后,我收到答案:
answer = client.invoke('RetrieveBLABLAObject', modelthings)
此答案是所请求对象的许多不同字段的结构。每个字段都是由"字符串"组成的结构。参数" _type"和参数"值",可能有不同的类型。
answer [key] [value] - 返回参数"值"的值。但是在调试模式下(我使用的是Python 2.7.6和PyCharm),它告诉我该值的类型为" Text"。不是" str",不是" unicode",但"文字"。
如果我通过
检查isinstance(obj[cur_key]['value'], unicode)
它告诉我它将此文本计为" unicode"。但是如果我将它与具有相同主体的unicode进行比较,则返回false:
if obj[cur_key]['value'] != u'String that I know is there':
print("true") #it is printing, but it shouldn't
为什么会这样?我怎样才能转换" Text" unicode? 我试过了
obj[cur_key]['value'].decode('utf-8')
它有例外。我怎样才能处理这个" Text"类型?
答案 0 :(得分:9)
您最有可能查看unicode
的子类。我想你在这里有一个suds.sax.text.Text()
的实例。由于这是子类,isinstance(obj, unicode)
为True。
它的值已经一个unicode字符串,因此解码将首先使用ASCII触发隐式编码,这确实会失败。
您只需使用以下命令将类型转换为unicode:
unicode(obj[cur_key]['value'])
但考虑到值仍然可以被XML转义; .unescape()
方法会返回未转义的版本(如果该值未被转义为开头,则会返回self
。)
与其他字符串比较时,请确保它们完全相等。 Unicode值可以包含许多隐藏的'值,如零宽度字符或组合字符,也可以用组合形式表示。使用repr(value)
获取转义表示,使这些代码点更加明显。
suds.sax.text.Text()
类没有特殊情况的相等性测试,因此您的!=
测试的工作方式与值unicode
字符串而不是子类相同