基本的に、私はwww.thetvdb.comにPythonでAPIを書いています。現在のコードはhereです。シーズン/ショー/エピソードデータを抽象化する最良の方法
それが要求されるようにAPIからデータをつかみ、何とかデータを保存し、実行して、それを利用できるようにしています
print tvdbinstance[1][23]['episodename'] # get the name of episode 23 of season 1
Tvdb()
クラス内のこの抽象データへの「最良」の方法は何ですか?
私はもともと
(あなたがif x[1].has_key(2): x[1][2] = []
などを行うことなく、x[1][2][3][4] = "something"
を行うことができます)、自動的にサブdictsを作成し、拡張Dict()
を使用それから私はちょうどこれが働いself.data[show_id][season_number][episode_number][attribute_name] = "something"
を行うことで、データを保存します大丈夫ですが、x[3][24]
が存在するはずかどうかをチェックする簡単な方法はありませんでした(私はseason_not_found例外を発生させることができませんでした)。
現在、それは4つのクラス、すなわちShowContainer
,Show
,Season
およびEpisode
を使用しています。それぞれが非常に基本的な辞書であり、私は簡単に余分な機能を追加することができます(search()
の機能、例えばShow()
の機能)。それぞれは__setitem__
,__getitem_
およびhas_key
です。
これはほとんどうまく動作します。そのシーズンにそれがあるかどうかをチェックすることができます。self.data
dict、そうでない場合は、raise season_not_found
です。そのエピソードがある場合はSeason()
にチェックインすることもできます。
問題は、今では辞書としての地位を提示していますが、すべての機能を持っていない、と私は__getitem__
と__setitem__
機能をオーバーライドしていますので、それは誤って再帰的に__getitem__
を呼び出して(私はよく分からないのは簡単ですDict
クラスを拡張すると問題が発生します)。
その他のわずかな問題は、古いDict
メソッド(これはself.data[seas_no][ep_no]['attribute'] = 'something'
)よりも多くの作業が追加されていることです。 _setItem
および_setData
を参照してください。現在のところ、読み取り専用のAPIインターフェイス(APIのユーザーはデータを取得するだけで、それ以上は追加しないようにする必要があります)ですが、それほど悪くはありません。エレガントです。
私はシリーズクラスのシステムはおそらく最善の方法だと思いますが、誰かがデータを格納するためのよりよいアイデアを持っていますか?そしてDict
でShowContainer
/etcクラスを拡張すると問題が発生しますか?