为了账号安全,请及时绑定邮箱和手机立即绑定

提取季节/节目/情节数据的最佳方法

提取季节/节目/情节数据的最佳方法

绝地无双 2021-03-22 10:08:43
基本上,我已经用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。每个命令都是非常基本的命令,我可以轻松地在其中添加额外的功能(例如,该search()功能在上Show())。每个人都有一个__setitem__,__getitem_和has_key。这通常效果很好,我可以在Shows中检查它是否有那个季节self.data,如果没有,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会引起问题?
查看完整描述

3 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

好的,您需要的是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")


查看完整回答
反对 回复 2021-03-22
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

为什么不使用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'])


查看完整回答
反对 回复 2021-03-22
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

Bartosz /澄清:“这很好,但是没有简单的方法可以检查x [3] [24]是否存在”

x['some show'][3][24]将返回第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)等。

它可以工作,但是似乎有很多重复的代码(每个类基本上是相同的,但是会引发不同的错误)


查看完整回答
反对 回复 2021-03-22
  • 3 回答
  • 0 关注
  • 270 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号