2008-08-08 14 views
13

基本的に、私は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のユーザーはデータを取得するだけで、それ以上は追加しないようにする必要があります)ですが、それほど悪くはありません。エレガントです。

私はシリーズクラスのシステムはおそらく最善の方法だと思いますが、誰かがデータを格納するためのよりよいアイデアを持っていますか?そしてDictShowContainer/etcクラスを拡張すると問題が発生しますか?

答えて

5

OK、たくさんのがあるようです。これにより、例外クラスを動的に構築することができます(classobjはクラス名の文字列を引数として取ります)。

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

これはあなたを与える:だから

self.__class__.__name__ 

、いくつかの文字列マングリングと連結した後、次のことができるようにする必要があります

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

あなたは常にを通じて、クラス名を取得することができますことを覚えておいてください適切な例外クラス名を取得し、その名前を使用してクラスオブジェクトを構築し、その例外を発生させます。

P.S. - 文字列を上げることもできますが、これは推奨されていません。

raise(self.__class__.__name__+"Exception") 
3

なぜSQLiteを使用しないのですか? Pythonには優れたサポートがあり、SQLクエリを作成してデータを取得することができます。あなたは辞書の配列を行うことができたSQLiteを使用しない場合はここでsqlite3


用のPythonドキュメントです。

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

あなたが任意のレコードにメタデータを追加し、非常に簡単に、私は過去に似た何かを行い、迅速かつ汚い階層的データベースとして、メモリ内のXML文書を使用していた

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']) 
0

それを検索しその方法保管のため。各ショー/シーズン/エピソードを要素(適切に入れ子になっている)として格納し、これらの要素の属性を要素のxml属性として格納できます。次に、XQueryを使用して情報を取り戻すことができます。

メモ:私はPythonの人ではないので、私はあなたのXMLサポートがどのようなものか分かりません。

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

0

私はここにこの部分を得ることはありません:これは大丈夫働い

を、が、x [3] [24]は、(私は「couldn存在しないかではないことになっていたかどうかをチェックする簡単な方法はありませんでした

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

問題と思われるもの:でと呼ばれる - トンそれを行うための方法がありseason_not_found例外)

を上げますそれと?

0

バルトシュ/「これは大丈夫働いたが、X [3] [24]が存在しないかではないことになっていたかどうかをチェックする簡単な方法はありませんでした」

x['some show'][3][24]はシーズン3を返します、 "のエピソード24明確にしますいくつかのショー "。シーズン3がない場合、私は擬似命令でtvdb_seasonnotfoundを発生させます。「いくつかのショー」が存在しない場合は、tvdb_shownotfoundを上げます。

それぞれのクラスの現在のシステムは、__getitem__です。 if self.seasons.has_key(requested_season_number)、Seasonクラスはif self.episodes.has_key(requested_episode_number)などをチェックします。

それは動作しますが、あなたが新しいモジュールからclassobjで必要なものを繰り返しコード(各クラスは基本的に同じですが、別のエラーが発生します)

関連する問題