Best way to abstract season/show/episode data

Question :

Best way to abstract season/show/episode data,

Answer :

Basically, I’ve written an API to www.thetvdb.com in Python. The current code can be found

It grabs data from the API as requested, and has to store the data somehow, and make it available by doing:

print tvdbinstance[1][23]['episodename'] # get the name of episode 23 of season 1  

What is the “best” way to abstract this data within the Tvdb() class?

I originally used a extended Dict() that automatically created sub-dicts (so you could do x[1][2][3][4] = "something" without having to do if x[1].has_key(2): x[1][2] = [] and so on)

Then I just stored the data by doing self.data[show_id][season_number][episode_number][attribute_name] = "something"

This worked okay, but there was no easy way of checking if x[3][24] was supposed to exist or not (so I couldn’t raise the season_not_found exception).

Currently it’s using four classes: ShowContainer, Show, Season and Episode. Each one is a very basic dict, which I can easily add extra functionality in (the search() function on Show() for example). Each has a __setitem__, __getitem_ and has_key.

This works mostly fine, I can check in Shows if it has that season in it’s self.data dict, if not, raise season_not_found. I can also check in Season() if it has that episode and so on.

Read More  CakePHP ACL Database Setup: ARO / ACO structure?

The problem now is it’s presenting itself as a dict, but doesn’t have all the functionality, and because I’m overriding the __getitem__ and __setitem__ functions, it’s easy to accidentally recursively call __getitem__ (so I’m not sure if extending the Dict class will cause problems).

The other slight problem is adding data into the dict is a lot more work than the old Dict method (which was self.data[seas_no][ep_no]['attribute'] = 'something'). See _setItem and _setData. It’s not too bad, since it’s currently only a read-only API interface (so the users of the API should only ever retrieve data, not add more), but it’s hardly… Elegant.

Read More  Authenticating Domain Users with System.DirectoryServices

I think the series-of-classes system is probably the best way, but does anyone have a better idea for storing the data? And would extending the ShowContainer/etc classes with Dict cause problems?

,

OK, what you need is classobj from new module. That would allow you to construct exception classes dynamically (classobj takes a string as an argument for the class name).

import new  myexc=new.classobj("ExcName",(Exception,),{})  i=myexc("This is the exc msg!")  raise i  

this gives you:

Traceback (most recent call last):  File "", line 1, in   __main__.ExcName: This is the exc msg!  

remember that you can always get the class name through:

self.__class__.__name__  

So, after some string mangling and concatenation, you should be able to obtain appropriate exception class name and construct a class object using that name and then raise that exception.

P.S. – you can also raise strings, but this is deprecated.

raise(self.__class__.__name__+"Exception")  

That’s the answer Best way to abstract season/show/episode data, Hope this helps those looking for an answer. Then we suggest to do a search for the next question and find the answer only on our site.

Disclaimer :

The answers provided above are only to be used to guide the learning process. The questions above are open-ended questions, meaning that many answers are not fixed as above. I hope this article can be useful, Thank you