【问题标题】:Method 'hasattr' not testing property correctly? [closed]方法“hasattr”没有正确测试属性? [关闭]
【发布时间】:2013-05-17 17:13:44
【问题描述】:

我真的被这个困住了!我从 Amazon 获取了一些产品数据,这些数据以 XML 形式返回。当搜索关键字有效时,它返回带有节点Items > Item 的XML。使用错误的关键字或不返回有效结果的关键字,Item 节点不存在。我正在使用一些函数将此 XML 转换为 Object 以便于解析。然后使用hasattr递归检查各个节点。

data = someXMLConverter(xml)

#works
if hasattr(data, 'Items'):
    #doesn't work
    if hasattr(data.Items, 'Item'):
        #some processing here
    else:
        return 'Error'
else:
    return 'Error'

即使Item 节点不存在,hasattr 也会返回 true。所以万一出现错误,我的网站就会爆炸!

有什么想法吗?

示例 XML:

<ItemSearchResponse>
    <OperationRequest>
        <HTTPHeaders><Header Name="UserAgent" Value="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0"/></HTTPHeaders>
        <RequestId>a393e9db-b86e-41de-965d-922c947056ff</RequestId>
        <Arguments>
            <Argument Name="Operation" Value="ItemSearch"/>
            <Argument Name="Service" Value="AWSECommerceService"/>
            <Argument Name="Signature" Value="z/R9HjzqukC6J53bmF4LPxh/xtlwBv9k+u6QjGsgFmA="/>
            <Argument Name="ItemPage" Value="1"/>
            <Argument Name="AssociateTag" Value="rutwsblog-20"/>
            <Argument Name="Version" Value="2006-09-11"/>
            <Argument Name="Keywords" Value="dggd"/>
            <Argument Name="AWSAccessKeyId" Value="AKIAJ3TAUM7ANQFQYP7Q"/>
            <Argument Name="Timestamp" Value="2013-05-17T16:50:55"/>
            <Argument Name="ResponseGroup" Value="Medium"/>
            <Argument Name="SearchIndex" Value="Books"/>
        </Arguments>
        <RequestProcessingTime>0.0217790000000000</RequestProcessingTime>
    </OperationRequest>
    <Items>
        <Request>
            <IsValid>True</IsValid>
            <ItemSearchRequest>
                <ItemPage>1</ItemPage>
                <Keywords>dggd</Keywords>
                <ResponseGroup>Medium</ResponseGroup>
                <SearchIndex>Books</SearchIndex>
            </ItemSearchRequest>
            <Errors>
                <Error>
                    <Code>AWS.ECommerceService.NoExactMatches</Code>
                    <Message>We did not find any matches for your request.</Message>
                </Error>
            </Errors>
        </Request>
        <TotalResults>0</TotalResults>
        <TotalPages>0</TotalPages>
            <MoreSearchResultsUrl>http://www.amazon.com/gp/redirect.html?camp=2025&creative=386001&location=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fsearch%3Fkeywords%3Ddggd%26url%3Dsearch-alias%253Dstripbooks&linkCode=xm2&tag=xxxx-20&SubscriptionId=xxxx</MoreSearchResultsUrl>
    </Items>
</ItemSearchResponse>

【问题讨论】:

  • 这些是什么类型的对象?换句话说,您使用的是什么 XML API?
  • print type(data), type(data.Items).
  • 我们不想听到您尝试过,我们想查看该命令的输出,以便我们为您提供帮助!
  • 我怀疑您的 data.Items.ItemNone 而不是不存在。确保这一点。
  • 我想以文本形式查看您的代码和回溯。您还可以包含 Amazon XML 响应本身的示例(不是 URL)。

标签: python python-2.7 xml-parsing hasattr


【解决方案1】:

当你得到None时,你可以使用以下来避免处理

data = someXMLConverter(xml)

if hasattr(data, 'Items'):
    if hasattr(data.Items, 'Item') and data.Items.Item is not None:
        #some processing here
    else:
        return 'Error'
else:
    return 'Error'

由于 if 语句在 hasattr 返回 False 时是短路的,因此我们可以在之后安全地检查 None

【讨论】:

  • 我会试试这个,同时您可以检查粘贴在我上面的问题中的错误 XML。
  • 你是我的英雄!这解决了我的问题!谢谢,我的工作取决于此 ;)
猜你喜欢
  • 2012-12-31
  • 2021-01-06
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多