【问题标题】:Strange python type "Text"?奇怪的python类型“文本”?
【发布时间】:2014-05-22 10:13:01
【问题描述】:

我使用库“suds”与 SOAP 服务器通信。 请求成功完成后,我收到了答复:

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

这个答案是请求对象的许多不同字段的结构。每个字段都是由“string”参数“_type”和参数“value”组成的结构,可以有不同的类型。

answer[key][value] - 返回参数“value”的值。但在调试模式下(我使用 Python 2.7.6 和 PyCharm),它显示值的类型为“文本”。不是“str”,不是“unicode”,而是“Text”。

如果我检查它

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

为什么会这样?如何将“文本”转换为 unicode? 我试过了

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

它例外。我该如何处理这种“文本”类型?

【问题讨论】:

  • repr(obj[cur_key]['value']) 给你什么?还有什么例外?
  • @Martijn 是对的,它是子类,以及他所描述的一切。无论如何感谢您的帮助。

标签: python suds


【解决方案1】:

您很可能正在查看unicode 的子类。我想你在这里有一个suds.sax.text.Text() 的实例。由于这是一个子类isinstance(obj, unicode) 为真。

它的值已经是一个unicode字符串,所以解码会先用ASCII触发一个隐含的encode,确实会失败。

您可以通过简单的使用将类型转换为 unicode:

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

但考虑到该值仍然可以被 XML 转义; .unescape() 方法返回一个未转义的版本(如果值开始时没有转义,它将返回 self)。

当与另一个字符串比较时,确保它们完全相等。 Unicode 值可以包含许多“隐藏”值,例如零宽度字符或组合字符,它们也可以以 combined 形式表示。使用repr(value) 获得转义表示,使此类代码点更加明显。

suds.sax.text.Text() 类不进行特殊情况相等性测试,因此您的 != 测试的工作方式与值是 unicode 字符串而不是子类相同。

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2020-05-24
    • 2015-06-14
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多