setdefault()关于suds soap dict结果

时间:2015-04-02 06:18:43

标签: python soap-client suds

给出以下通用代码:

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实例没有属性' value3'

result.SoapRecord返回的将包含所有4个record.value,但有些人没有此信息。有没有办法设置要返回的默认值,如NoneNull?我曾尝试在那里投掷record.setdefault('value3', None),但它不起作用。任何和所有的帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

现在考虑到这一切,要将所有内容保存到单个表达式中,您可以执行以下操作:

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

这是一个布尔表达式,在Python中,您可以在不将值完全转换为bools的情况下计算布尔表达式。因此,该表达式将为您提供值str(record.value1)或仅None

对不起,如果这个答案中的任何内容有误,我不熟悉Soap库。

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