基本上,我用Python编写了一个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
、Season
和 Episode
。每个都是一个非常基本的字典,在其中可以轻松添加额外的功能(例如 Show()
上的 search()
函数)。每个字典都有一个 __setitem__
、__getitem_
和 has_key
。这在大多数情况下都可以很好地工作,我可以在 Show 中检查是否在其 self.data
字典中具有该季节,如果没有,则引发 season_not_found 异常。我还可以在 Season()
中检查是否有该集,等等。现在的问题是,它表现得像一个字典,但没有所有的功能,并且因为我覆盖了 __getitem__
和 __setitem__
函数,所以很容易意外地递归调用 __getitem__
(因此我不确定扩展 Dict
类是否会导致问题)。另一个小问题是将数据添加到字典中比旧的 Dict
方法需要更多的工作(它是 self.data[seas_no][ep_no]['attribute'] = 'something'
)。看看 _setItem
和 _setData
。这也不是很糟糕,因为它目前只是一个只读的 API 接口(因此 API 的用户只能检索数据,而不是添加更多),但它几乎不... 优雅。我认为类系列系统可能是最好的方式,但是否有更好的存储数据的方法?扩展 ShowContainer
等类与 Dict
会导致问题吗?