A03ki / uecbbs

@uec_bbsを支えるPythonパッケージTwissifyの管理
https://twitter.com/uec_bbs
MIT License
0 stars 0 forks source link

タイムラインの`since_id`と`max_id`を`namedtuple`で包んでから返すべき #49

Closed A03ki closed 4 years ago

A03ki commented 4 years ago

前提

テーブルのレコードを取得するとき、レコードが既に存在するかしないかで返ってくる値が異なる。 レコードがあればレコードのオブジェクトが返り、なければNoneが返る。

問題点

例えば、ホームタイムラインのsince_idを取得したいとする。apiw.home_timeline_idsを使ったときに、ホームタイムラインのレコードが存在する場合はsince_idを属性にもつオブジェクトが返る。存在しない場合はNoneが返る。Nonesince_idという属性を持っていないので、レコードがある時とない時で分岐して処理を書く必要がある。

from twissify.api_wrapper import APIWrapper

...

apiw = APIWrapper(api, self.storage)

home_timeline_indexes = apiw.home_timeline_ids

if home_timeline_indexes is None:
    home_timeline_since_id = None
else:
    home_timeline_since_id = home_timeline_indexes.since_id

...

このif文を全てのタイムラインごとに行うのは面倒。

解決策

該当するレコードがあるなし関係なく、apiw.home_timeline_idsから返ってくる値が全てsince_idという属性を持ったオブジェクトであればいい。これはnamedtupleを使えば簡単にできる。したがって、namedtupleを使ってsince_idmax_idを持つオブジェクトに包んでから返すようにする。

home_timeline_since_id = apiw.home_timeline_ids.since_id

このように、必ず属性としてsince_idを持っているので使いやすくなる。