Pregunta

Básicamente, he escrito una API para www.thetvdb.com en Python.El actual código se puede encontrar aquí.

Toma de datos de la API de lo solicitado, y tiene que almacenar los datos de alguna manera, y hacer que esté disponible haciendo:

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

¿Cuál es la "mejor" manera de resumen de este tipo de datos dentro de la Tvdb() la clase?

He utilizado originalmente a la extensión de la Dict() que se 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)

Luego simplemente se almacenan los datos haciendo self.data[show_id][season_number][episode_number][attribute_name] = "something"

Esto funcionó bien, pero no había manera fácil de comprobar si x[3][24] se supone que existe o no existe (por lo que no podía levantar la season_not_found excepción).

En la actualidad es el uso de cuatro clases: ShowContainer, Show, Season y Episode.Cada uno es muy básico dict, que fácilmente puede agregar funcionalidad extra en (el search() función en Show() por ejemplo).Cada uno tiene un __setitem__, __getitem_ y has_key.

Esto funciona sobre todo bien, puedo comprobar en la Muestra si se tiene que temporada es self.data dict, si no, raise season_not_found.También puedo comprobar en Season() si tiene en ese episodio y así sucesivamente.

El problema ahora es que se está presentando a sí mismo como un diccionario, pero no tiene toda la funcionalidad, y porque soy la invalidación de la __getitem__ y __setitem__ funciones, es fácil accidentalmente llama recursivamente __getitem__ (así que no estoy seguro de si la ampliación de la Dict la clase va a causar problemas).

El otro pequeño problema es la adición de datos en el diccionario es un trabajo mucho más que el anterior Dict método (que fue self.data[seas_no][ep_no]['attribute'] = 'something').Ver _setItem y _setData.No es demasiado malo, ya que es en la actualidad sólo una de sólo-lectura de la API (interfaz para que los usuarios de la API sólo debe siempre recuperar los datos, no añadir más), pero casi...Elegante.

Creo que la serie de clases de sistema es probablemente la mejor manera, pero ¿alguien tiene una mejor idea para el almacenamiento de los datos?Y sería la ampliación de la ShowContainer/etc clases con Dict causar problemas?

¿Fue útil?

Solución

OK, lo que necesitas es classobj de nuevo módulo.Que le permita construir excepción de las clases de forma dinámica (classobj toma una cadena como argumento el nombre de la clase).

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

esto le da a usted:

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

recuerde que siempre puede obtener el nombre de la clase a través de:

self.__class__.__name__

Así, después de algunos cadena de destrozarlo y concatenación, usted debería ser capaz de obtener la correspondiente excepción nombre de la clase y la construcción de un objeto de la clase con ese nombre y, a continuación, plantear que la excepción.

P. S.- también puede elevar las cadenas, pero este está en desuso.

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

Otros consejos

¿Por qué no usar SQLite?Hay buen apoyo en Python y se puede escribir consultas SQL para obtener los datos.Aquí es el de Python docs para sqlite3


Si usted no desea utilizar SQLite usted podría hacer una matriz de dicts.

episodes = []
episodes.append({'season':1, 'episode': 2, 'name':'Something'})
episodes.append({'season':1, 'episode': 2, 'name':'Something', 'actors':['Billy Bob', 'Sean Penn']})

Que manera de agregar metadatos a cualquier registro y búsqueda muy fácilmente

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'])

Yo he hecho algo similar en el pasado y se utiliza en la memoria del documento XML como un rápido y sucio hierachical base de datos para el almacenamiento.Usted puede almacenar cada una de mostrar/temporada/episodio como un elemento (anidados correctamente) y los atributos de estas cosas como atributos xml de los elementos.A continuación, puedes usar XQuery para obtener información de vuelta.

NOTA: Yo no soy un Python chico así que no sé cuál es su compatibilidad con xml es como.

NOTA 2: Usted querrá perfil de este porque va a ser más grande y más lento que la solución a la que ya tienes.Probablemente suficiente si estás haciendo algún alto volumen de procesamiento de XML es, probablemente, no va a ser tu amigo.

No entiendo esta parte aquí:

Esto funcionó bien, pero no había manera fácil de comprobar si x[3][24] se supone que existe o no existe (por lo que no podía levantar la season_not_found excepción)

Hay una manera de hacer la llamada en:

>>>x={}
>>>x[1]={}
>>>x[1][2]={}
>>>x
{1: {2: {}}}
>>> 2 in x[1]
True
>>> 3 in x[1]
False

lo que parece ser el problema con eso?

Bartosz/A aclarar "Esto funcionó bien, pero no había manera fácil de comprobar si x[3][24] se supone que existe o no existe"

x['some show'][3][24] volvería temporada 3, episodio 24 de "un espectáculo".Si no hay temporada 3, quiero que el pseudo-dict para elevar tvdb_seasonnotfound, si "algunos muestran" no existe, entonces aumentar la tvdb_shownotfound

El sistema actual de una serie de clases, cada uno con un __getitem__ - Mostrar los cheques if self.seasons.has_key(requested_season_number), la Temporada de la clase de cheques if self.episodes.has_key(requested_episode_number) y así sucesivamente.

Funciona, pero parece ser que hay una gran cantidad de código redundante (cada clase es básicamente el mismo, pero genera un error diferente)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top