【问题标题】:setdefault() on suds soap dict resultssuds soap dict 结果上的 setdefault()
【发布时间】:2015-04-02 06:18:43
【问题描述】:

给定以下通用代码:

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's 返回将包含所有 4 个record.value's 但有些没有这个。有没有办法设置要返回的默认值,如 NoneNull?我曾尝试将record.setdefault('value3', None) 扔在那里,但它不起作用。任何和所有的帮助将不胜感激。提前谢谢你。

【问题讨论】:

    标签: python soap-client suds


    【解决方案1】:

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

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

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

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

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

    编辑:正如@plaes 在 cmets 中指出的那样,getattr(record, 'value1', None) 是一种更短更容易的方法。谢谢各位:)

    【讨论】:

    • 实际上效果很好。非常感谢你。你是天赐之物。
    • getattr(record, 'value1', None) 会更短。
    • @plaes 谢谢,我已经对我的回答进行了编辑,我给了你信用。
    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多