奇怪的python类型"文字"?

时间:2014-05-22 10:13:02

标签: python suds

我使用图书馆" 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"类型?

1 个答案:

答案 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字符串而不是子类相同