suds soap 字典结果上的 setdefault()

setdefault() on suds soap dict results

给定以下通用代码:

def soapQuery():
    soapuser = "Base64String"
    soappass = "Base64String"
    soapurl = 'https://url/file.ext?wsdl'
    ntlm = WindowsHttpAuthenticated(username=soapuser, password=soappass)
    client = Client(soapurl, transport=ntlm)
    result = client.service.method(something='somethingtosearchfor')
    soapfiltered = []
    for record in result.SoapRecord:
        soapfiltered.extend((str(record.value1), str(record.value2), str(record.value3), str(record.value4)))
    return zip(*[iter(soapfiltered)]*4)

当 运行 我得到以下错误:

AttributeError: SoapRecord instance has no attribute 'value3'

返回的

MOST of result.SoapRecord 将包含所有 4 个 record.value,但有些没有。有没有办法设置要返回的默认值,如 NoneNull?我试过将 record.setdefault('value3', None) 扔进去,但它不起作用。任何和所有帮助将不胜感激。提前谢谢你。

嗯,在Python中没有Null,而dict的setdefault默认是None。顺便说一句,字典不能通过 Python 中的点运算符访问(遗憾的是,我想念 JS 的功能)所以基本上......我不认为 record 是字典,而是一个对象.要检查对象是否具有 属性,您可以执行 hasattr(record, 'value1') 例如。

考虑到所有这些,要将所有内容都放在一个表达式中,您可以这样做:

hasattr(record, 'value1') and str(record.value1) or None

这是一个布尔表达式,在 Python 中,您可以计算布尔表达式而无需将值完全转换为布尔值。因此,该表达式将为您提供 str(record.value1) 的值或简单的 None.

抱歉,如果此答案中有任何错误,我对 Soap 库不熟悉。

编辑: 正如@plaes 在评论中指出的那样,getattr(record, 'value1', None) 是一种更短、更简单的方法。谢谢你:)