Básicamente, escribí una API para www.thetvdb.com en Python. El código actual se puede encontrar here.La mejor forma de resumir datos de temporada/show/episodio
Se agarra a los datos de la API a lo solicitado, y tiene que almacenar los datos de alguna manera, y ponerla a disposición haciendo:
print tvdbinstance[1][23]['episodename'] # get the name of episode 23 of season 1
¿Cuál es el "mejor" forma de abstraer estos datos dentro de la clase Tvdb()
?
originalmente utilizó un prolongado Dict()
que crea automáticamente sub-dicts (por lo que podría hacer x[1][2][3][4] = "something"
sin tener que hacer if x[1].has_key(2): x[1][2] = []
y así sucesivamente)
Entonces sólo almacena los datos haciendo self.data[show_id][season_number][episode_number][attribute_name] = "something"
Esto funcionó está bien, pero no había una manera fácil de comprobar si se suponía que x[3][24]
existía o no (así que no pude subir la excepción season_not_found).
Actualmente se trata de utilizar cuatro clases: ShowContainer
, Show
, Season
y Episode
. Cada uno es un dict muy básico, en el que puedo agregar funcionalidad extra fácilmente (la función search()
en Show()
por ejemplo). Cada uno tiene un __setitem__
, __getitem_
y has_key
.
Esto funciona en su mayoría bien, puedo comprobar en espectáculos si tiene esa temporada en self.data
dict, si no, raise season_not_found
. También puedo registrarme en Season()
si tiene ese episodio y así sucesivamente.
El problema ahora es que es presentarse como un diccionario, pero no tiene toda la funcionalidad, y porque estoy anulando los __getitem__
y __setitem__
funciones, es fácil accidentalmente de forma recursiva llamar __getitem__
(así que no estoy seguro si extender la clase Dict
causará problemas).
El otro problema leve es agregar datos en el dict es mucho más trabajo que el viejo método Dict
(que era self.data[seas_no][ep_no]['attribute'] = 'something'
). Ver _setItem
y _setData
. No es tan malo, ya que actualmente es solo una interfaz API de solo lectura (por lo que los usuarios de la API solo deberían recuperar datos, no agregar más), pero es difícil ... Elegante.
Creo que el sistema de series de clases es probablemente la mejor manera, pero ¿alguien tiene una mejor idea para almacenar los datos? ¿Y la ampliación de las clases ShowContainer
/etc con Dict
causa problemas?