xlabel - subplot title python




抽象季節/表演/情節數據的最佳方式 (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'])

基本上,我用Python編寫了一個API到www.thetvdb.com。 目前的代碼可以在這裡找到。

它根據請求從API抓取數據,並且必須以某種方式存儲數據,並通過執行以下操作來使其可用:

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

Tvdb()類中提取這些數據的“最佳”方法是什麼?

我最初使用了一個擴展的Dict()來自動創建子字典(所以if x[1].has_key(2): x[1][2] = []不需要做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異常)。

目前它使用四個類: ShowContainerShowSeasonEpisode 。 每一個都是一個非常基本的字典,我可以很容易地在Show()search()函數中添加額外的功能)。 每個都有一個__setitem____getitem_has_key

這工作大多好,我可以檢查顯示,如果它有self.data字典中的那個季節,如果沒有, raise season_not_found 。 我也可以檢查Season()如果它有這個情節等等。

現在的問題是它本身是一個字典,但沒有所有的功能,因為我重寫__getitem____setitem__函數,很容易意外遞歸調用__getitem__ (所以我不知道是否擴展Dict上課會造成問題)。

另一個小問題是在dict中添加數據比老dict方法( self.data[seas_no][ep_no]['attribute'] = 'something' )要self.data[seas_no][ep_no]['attribute'] = 'something' 。 請參閱_setItem_setData 。 這也不錯,因為它目前只有一個只讀的API接口(所以API的用戶只應該檢索數據,而不是添加更多),但是它不是那麼優雅。

我認為系列課程系統可能是最好的方法,但有沒有人有更好的想法來存儲數據? 而且會擴展與Dict ShowContainer / etc類導致問題?


過去我做了類似的事情,並使用內存中的XML文檔作為快速而臟的分層數據庫來存儲。 您可以將每個節目/季節/劇集作為元素(適當嵌套)和這些元素的屬性(作為元素上的xml屬性)進行存儲。 然後你可以使用XQuery來取回信息。

注意:我不是一個Python傢伙,所以我不知道你的xml支持是什麼樣的。

注2:你需要對此進行分析,因為它比你已經得到的解決方案更大更慢。 如果你正在做大量的處理,那麼XML可能不會成為你的朋友。


巴托什/澄清“這工作好,但沒有簡單的方法來檢查x [3] [24]是否應該存在或不存在”

x['some show'][3][24]將返回“某些節目”的第3季,第24集。 如果沒有第三季,我想讓偽代碼提高tvdb_seasonnotfound,如果“some show”不存在,那麼提高tvdb_shownotfound

當前系統的一系列類,每一個都帶有一個__getitem__ - 顯示檢查if self.seasons.has_key(requested_season_number) ,季節類檢查if self.episodes.has_key(requested_episode_number)等等。

它的工作,但它似乎有很多重複的代碼(每個類基本相同,但引發了一個不同的錯誤)


好的,你需要的是從新模塊的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")




data-structures