dbr*_*dbr 15 python data-structures
基本上,我已经用Python在www.thetvdb.com上编写了一个API.可在此处找到当前代码.
它根据请求从API中获取数据,并且必须以某种方式存储数据,并通过执行以下操作使其可用:
print tvdbinstance[1][23]['episodename'] # get the name of episode 23 of season 1
Run Code Online (Sandbox Code Playgroud)
在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.
这个工作大部分都很好,我可以查看显示它是否有它的self.datadict中的那个季节,如果没有,raise season_not_found.我也可以检查Season()它是否有那一集等等.
现在的问题是,它的提出本身作为一个字典,但不具有的所有功能,而且因为我重写__getitem__和__setitem__功能,很容易不小心递归调用__getitem__(所以我不知道如果扩展Dict类会引起问题).
另一个小问题是将数据添加到dict中的工作量远远超过旧Dict方法(当时self.data[seas_no][ep_no]['attribute'] = 'something').见_setItem和_setData.这不是太糟糕,因为它目前只是一个只读的API接口(所以API的用户应该只检索数据,而不是添加更多),但它很难......优雅.
我认为系列级系统可能是最好的方法,但是有没有人有更好的存储数据的想法?并会延长ShowContainer/ etc类的Dict原因问题?
好的,你需要的是classobj来自新模块.这将允许您动态构造异常类(classobj将字符串作为类名的参数).
import new
myexc=new.classobj("ExcName",(Exception,),{})
i=myexc("This is the exc msg!")
raise i
Run Code Online (Sandbox Code Playgroud)
这给你:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.ExcName: This is the exc msg!
Run Code Online (Sandbox Code Playgroud)
请记住,您始终可以通过以下方式获取课程名称:
self.__class__.__name__
Run Code Online (Sandbox Code Playgroud)
因此,在一些字符串修改和连接之后,您应该能够获得适当的异常类名称并使用该名称构造一个类对象,然后引发该异常.
PS - 您也可以提高字符串,但这已被弃用.
raise(self.__class__.__name__+"Exception")
Run Code Online (Sandbox Code Playgroud)