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和。每一个都是一个非常基本的字典,我可以很容易地在其中添加额外的功能(例如函数)。每个都有,和。SeasonEpisodesearch()Show()__setitem____getitem_has_key

这工作得很好,如果它的self.data字典中有那个季节,我可以检查 Shows,如果没有,raise season_not_found. 我也可以检查Season()它是否有那一集等等。

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

另一个小问题是将数据添加到 dict 比旧Dict方法(原方法self.data[seas_no][ep_no]['attribute'] = 'something')要多得多。见_setItem_setData。这还不错,因为它目前只是一个只读的 API 接口(因此 API 的用户应该只检索数据,而不是添加更多数据),但它几乎没有......优雅。

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

4

5 回答 5

7

好的,你需要的是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,你可以做一个 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'])
于 2008-08-08T16:45:50.117 回答
0

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

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

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

于 2008-08-09T15:13:14.293 回答
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]将返回“some show”第 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 回答