基本上,我已经写了一个API www.thetvdb.com 在蟒蛇。目前的代码可以被发现 在这里,.

它抓住数据从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例外)。

目前的使用四个类别: ShowContainer, Show, SeasonEpisode.每个人都是一个非常基本字典,我可以很容易增加额外的功能(这 search() 功能上 Show() 例如)。每个人都有一个 __setitem__, __getitem_has_key.

这种工作大多是没事的,我可以检查显示,如果它具有季节在它的 self.data 字典,如果没有, raise season_not_found.我还可以检查 Season() 如果它有那个情节等。

现在的问题是它提出本身作为一个词典,但没有所有功能,并且因为我是压倒一切的 __getitem____setitem__ 功能,很容易不小心递归的呼叫 __getitem__ (所以我不确定如果延伸 Dict 类会引起问题)。

其他轻微的问题是数据添加到该词典是一个更多的工作,比旧 Dict 方法(这是 self.data[seas_no][ep_no]['attribute'] = 'something').看看 _setItem_setData.这不是太糟糕了,因为它是目前唯一一个只读API接口(因此用户的API应只能检索的数据,而不是添加更多),但它几乎没有...优雅。

我认为系列的类系统可能是最好的方式,但没有任何人有一个更好的想法,用于储存的数据?并将延伸 ShowContainer/etc类 Dict 引起的问题?

有帮助吗?

解决方案

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__

因此,在一些串重整和连接,你应该能够获得适当的异常类的名称和建造一个类对象使用这个名字再提高这一例外。

P.S.-你也可以提高字符串,但这已被否决。

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

其他提示

为什么不能使用源码?有良好的支助,蟒蛇,你可以写SQL查询获得的数据。这里是蟒蛇文档 sqlite3


如果你不想使用源码你可以做一系列的字典.

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

我已经做了一些类似的过去和使用一个内存XML文件作为一种快速的和肮脏的hierachical数据库,用于储存。你可以存储每个显示/季节/集作为一个元素(嵌套适当)和属性的这些东西作为xml属性的要素。然后你可以用了,谢谢,获得信息。

注: 我不是蟒蛇的家伙所以我不知道你xml支持。

注2: 你会想要分析这一点,因为它会更大,速度慢于解决你已经得到了。可能不够,如果你正在做一些高音量的处理,然后XML可能不会被你的朋友。

我没得到这个部分:

这个工作好吧,但是没有简单的方法的检查,如果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

有什么问题吗?

巴尔托/澄清"这个工作好吧,但是没有简单的方法的检查,如果x[3][24]应该存在或不是"

x['some show'][3][24] 将返回季节3,24"某展"。如果没有第3季,我想伪字典,以提高tvdb_seasonnotfound,如果"有些显示"不存在,然后提高tvdb_shownotfound

目前的系统的一系列的课程,每一个 __getitem__ -检查显示 if self.seasons.has_key(requested_season_number), 季节类检查 if self.episodes.has_key(requested_episode_number) 等等。

它的工作原理,但是它似乎有很多的重复代码(每一类是基本相同,但提出了一个不同的错误)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top