抽象季节/节目/剧集数据的最佳方式

时间:2008-08-08 14:05:45

标签: python data-structures

基本上,我已经用Python在www.thetvdb.com上编写了一个API。可以找到当前代码here

它根据请求从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异常)。

目前,它使用了四个类:ShowContainerShowSeasonEpisode。每个都是一个非常基本的dict,我可以轻松地添加额外的功能(例如search()上的Show()函数)。每个都有__setitem____getitem_has_key

这大部分都很好,我可以查看节目中是否有self.data字典中的那个季节,如果没有,raise season_not_found。我还可以查看Season()是否有该剧集等等。

现在的问题是它将自己呈现为一个字典,但没有所有功能,而且因为我正在覆盖__getitem____setitem__函数,所以很容易意外地递归调用{ {1}}(所以我不确定扩展__getitem__类是否会导致问题)。

另一个小问题是在dict中添加数据比旧Dict方法(Dict)要多得多。请参阅self.data[seas_no][ep_no]['attribute'] = 'something'_setItem。这不是太糟糕,因为它目前只是一个只读的API接口(所以API的用户应该只检索数据,而不是添加更多),但它很难......优雅。

我认为系列级系统可能是最好的方法,但有没有人有更好的存储数据的想法?并且会_setData / etc类扩展ShowContainer导致问题吗?

5 个答案:

答案 0 :(得分:5)

好的,你需要的是来自新模块的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")

答案 1 :(得分:3)

为什么不使用SQLite? Python中有很好的支持,你可以编写SQL查询来获取数据。以下是sqlite3

的Python文档

如果你不想使用SQLite,你可以做一系列的dicts。

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

答案 2 :(得分:0)

我过去做过类似的事情,并使用内存中的XML文档作为存储的快速而肮脏的分层数据库。您可以将每个节目/季节/剧集存储为元素(适当嵌套),并将这些事物的属性存储为元素上的xml属性。然后你可以使用XQuery来获取信息。

注意:我不是Python人,所以我不知道你的xml支持是什么。

注意2:您需要对此进行分析,因为它会比您已经获得的解决方案更大更慢。如果您正在进行一些高容量处理,那么XML很可能不会成为您的朋友。

答案 3 :(得分: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

这似乎是什么问题?

答案 4 :(得分:0)

Bartosz /澄清“这工作没问题,但没有简单的方法来检查是否存在x [3] [24]”

x['some show'][3][24]将返回第3季第24集“some show”。如果没有第3季,我希望伪字典提高tvdb_seasonnotfound,如果“some show”不存在,则提高tvdb_shownotfound

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

它有效,但似乎有很多重复的代码(每个类基本相同,但引发了不同的错误)