17

基本的に、私は Python で www.thetvdb.com への API を書きました。現在のコードはここにあります。

要求に応じて API からデータを取得し、何らかの方法でデータを保存し、次のようにして利用できるようにする必要があります。

print tvdbinstance[1][23]['episodename'] # get the name of episode 23 of season 1

Tvdb()クラス内でこのデータを抽象化する「最良の」方法は何ですか?

Dict()私は元々、サブ辞書を自動的に作成する拡張機能を使用していました(そのため、何もしx[1][2][3][4] = "something"なくても実行できますif x[1].has_key(2): x[1][2] = [])。

次に、次のようにしてデータを保存しましたself.data[show_id][season_number][episode_number][attribute_name] = "something"

これは問題なく機能しましたが、 が存在するかどうかを確認する簡単な方法がありx[3][24]ませんでした (そのため、season_not_found 例外を発生させることができませんでした)。

現在ShowContainerShow、 、Seasonの4 つのクラスを使用していEpisodeます。それぞれが非常に基本的な辞書であり、追加機能を簡単に追加できます (たとえば、search()関数 on )。Show()それぞれに__setitem____getitem_およびがありhas_keyます。

これはほとんど問題なく動作します。そのシーズンがself.dataディクテーションに含まれているかどうかをショーで確認できます。そうでない場合は、raise season_not_found. Season()そのエピソードなどがあるかどうかもチェックできます。

現在の問題は、辞書として提示されていますが、すべての機能を備えているわけではありません.and関数をオーバーライドしているため、__getitem__誤っ__setitem__て再帰的に呼び出すのは簡単です(したがって、クラスを__getitem__拡張すると問題が発生するかどうかはわかりません) Dict)。

もう1つの小さな問題は、dictにデータを追加することは、古いDict方法(self.data[seas_no][ep_no]['attribute'] = 'something'. _setItemおよびを参照してください_setData。現在のところ読み取り専用の API インターフェースにすぎないため (したがって、API のユーザーはデータを取得するだけで、それ以上追加する必要はありません)、それほど悪くはありませんが、ほとんど... エレガントではありません。

一連のクラスシステムがおそらく最良の方法だと思いますが、データを保存するためのより良いアイデアを持っている人はいますか? ShowContainerまた、 /etc クラスを拡張するDictと問題が発生しますか?

4

5 に答える 5

7

OK、必要なのはclassobj新しいモジュールからです。これにより、例外クラスを動的に構築できます(classobjクラス名の引数として文字列を取ります)。

import new
myexc=new.classobj("ExcName",(Exception,),{})
i=myexc("This is the exc msg!")
raise i

これはあなたに与えます:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.ExcName: This is the exc msg!

クラス名は、次の方法でいつでも取得できることに注意してください。

self.__class__.__name__

したがって、文字列のマングリングと連結の後、適切な例外クラス名を取得し、その名前を使用してクラスオブジェクトを構築し、その例外を発生させることができるはずです。

PS-文字列を上げることもできますが、これは非推奨です。

raise(self.__class__.__name__+"Exception")
于 2008-08-14T07:08:19.280 に答える
4

なぜSQLiteを使わないのですか? Python には優れたサポートがあり、SQL クエリを記述してデータを取得できます。これはsqlite3の Python ドキュメントです。


SQLite を使用したくない場合は、辞書の配列を作成できます。

episodes = []
episodes.append({'season':1, 'episode': 2, 'name':'Something'})
episodes.append({'season':1, 'episode': 2, 'name':'Something', 'actors':['Billy Bob', 'Sean Penn']})

そうすれば、任意のレコードにメタデータを追加して、非常に簡単に検索できます

season_1 = [e for e in episodes if e['season'] == 1]
billy_bob = [e for e in episodes if 'actors' in e and 'Billy Bob' in e['actors']]

for episode in billy_bob:
    print "Billy bob was in Season %s Episode %s" % (episode['season'], episode['episode'])
于 2008-08-08T16:45:50.117 に答える
0

私はここでこの部分を取得しません:

これは問題なく機能しましたが、x [3] [24]が存在するかどうかを確認する簡単な方法はありませんでした(したがって、season_not_found例外を発生させることはできませんでした)

それを行う方法があります-で呼び出さます:

>>>x={}
>>>x[1]={}
>>>x[1][2]={}
>>>x
{1: {2: {}}}
>>> 2 in x[1]
True
>>> 3 in x[1]
False

それの問題は何だと思われますか?

于 2008-08-11T20:07:59.520 に答える
0

Bartosz/「これは問題なく動作しましたが、x[3][24] が存在するかどうかを確認する簡単な方法がありませんでした」を明確にするため

x['some show'][3][24]「いくつかのショー」のシーズン3、エピソード24を返します. シーズン 3 が存在しない場合は、疑似辞書で tvdb_seasonnotfound を発生させ、「一部の番組」が存在しない場合は tvdb_shownotfound を発生させます。

一連のクラスの現在のシステムで、それぞれに__getitem__- Show チェックif self.seasons.has_key(requested_season_number)、 Season クラス チェックif self.episodes.has_key(requested_episode_number)などがあります。

動作しますが、コードの繰り返しが多いようです (各クラスは基本的に同じですが、異なるエラーが発生します)。

于 2008-08-12T17:55:22.233 に答える
0

私は過去に似たようなことをしたことがあり、メモリ内の XML ドキュメントをストレージ用のクイックでダーティな階層データベースとして使用しました。各ショー/シーズン/エピソードを要素 (適切にネストされたもの) として格納し、これらの属性を要素の xml 属性として格納できます。その後、XQuery を使用して情報を取得できます。

注:私は Python の専門家ではないので、あなたの xml サポートがどのようなものかはわかりません。

注 2:既に取得しているソリューションよりも大きく、遅くなるため、これをプロファイリングする必要があります。大量の処理を行っている場合は、おそらく XML は役に立たないでしょう。

于 2008-08-09T15:13:14.293 に答える