代码之家  ›  专栏  ›  技术社区  ›  beardedeagle

suds soap dict结果上的setdefault()

  •  1
  • beardedeagle  · 技术社区  · 9 年前

    给定以下通用代码:

    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 是的,但有些没有。是否有方法设置要返回的默认值,如 None Null ? 我试过投掷 record.setdefault('value3', None) 但它不起作用。如有任何帮助,将不胜感激。提前谢谢。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Shashank    9 年前

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

    考虑到这一点,为了将所有内容都保持在一个表达式中,您可以这样做:

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

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

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

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