読者です 読者をやめる 読者になる 読者になる

ほんじゃら堂

めんどくさい仕事をラクにする作業自動化レシピ集

Pythonでオブジェクトから階層ごとに属性があるかチェックせずに値を取得するための関数

AmazonAPIを触っていて、レスポンスとして返ってきた(XMLから生成された)オブジェクトから値を取得する際にいちいちhasattrでチェックするのが面倒だったので、そのパスがなければデフォルト値を返す関数を作った。

見つけられなかったけど、標準ライブラリにありそう...。

hasattrで属性があるかチェックして、 あったら次の階層に進み、なかったらデフォルト値を返す。

オブジェクトの属性が

obj.__dict__[属性名]

で取得できることが分かったのは収穫だった。(Python2.7)

下記のような形でAmazonAPIからのレスポンスを処理してみたらうまく動いた。

amazon_test.py

import bottlenose
from lxml import objectify

amazon = bottlenose.Amazon(AWS_ACCESS_KEY_ID, AWS_SECRET_KEY, Region='JP')

res = amazon.ItemSearch(
        Keywords=u'ダイエット'
        , SearchIndex='Books'
        , ItemPage='1'
        , ResponseGroup='Medium'
        , AssociateTag=AWS_ASSOCIATE_TAG
)

oot = objectify.fromstring(res)
for item in root.Items.Item:
    title = get_obj_attr(item, 'ItemAttributes.Title')
    author = get_obj_attr(item, 'ItemAttributes.Author')
    rank = get_obj_attr(item, 'SalesRank', 0)
    print '%s: %s, rank:%s, author:%s' % (item.ASIN, title, rank, author)

ちゃちゃっとAPIを試したい時なんかに使ってみよう。

Pythonプロフェッショナルプログラミング 第2版

Pythonプロフェッショナルプログラミング 第2版