structures data control comprehension and algorithms python data-structures

data - python set



La mejor forma de resumir datos de temporada/espectáculo/episodio (5)

¿Por qué no usar SQLite? Existe un buen soporte en Python y puede escribir consultas SQL para obtener los datos. Aquí están los documentos de Python para sqlite3

Si no quieres usar SQLite, puedes hacer una variedad de dicts.

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

De esta forma, agregas metadatos a cualquier registro y lo buscas 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''])

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

Captura los datos de la API según lo solicitado, y tiene que almacenar los datos de alguna manera, y ponerlos a disposición haciendo:

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

¿Cuál es la "mejor" forma de abstraer estos datos dentro de la clase Tvdb() ?

Originalmente usé un Dict() extendido Dict() que automáticamente creaba sub-dicts (para que pudieras hacer x[1][2][3][4] = "something" sin tener que hacer if x[1].has_key(2): x[1][2] = [] y así sucesivamente)

Luego acabo de almacenar los datos haciendo self.data[show_id][season_number][episode_number][attribute_name] = "something"

Esto funcionó bien, pero no había una manera fácil de verificar si se suponía que x[3][24] existía o no (así que no pude subir la excepción season_not_found).

Actualmente usa cuatro clases: ShowContainer , Show , Season y Episode . Cada uno es un dict muy básico, en el cual 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 verificar en Shows si tiene esa temporada en su propia self.data de self.data , si no, raise season_not_found . También puedo verificar en Season() si tiene ese episodio y así sucesivamente.

El problema ahora es que se presenta a sí mismo como un dict, pero no tiene toda la funcionalidad, y como estoy anulando las funciones __getitem__ y __setitem__ , es fácil llamar accidentalmente __getitem__ (por lo que no estoy seguro si se extiende el Dict clase causará problemas).

El otro pequeño problema es agregar datos en el dict es mucho más trabajo que el antiguo método Dict (que era self.data[seas_no][ep_no][''attribute''] = ''something'' ). Ver _setItem y _setData . No es tan malo, ya que actualmente solo es 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, pero ¿alguien tiene una mejor idea para almacenar los datos? ¿Y extender las clases de ShowContainer / etc con Dict causa problemas?


He hecho algo similar en el pasado y usé un documento XML en memoria como una base de datos jerárquica rápida y sucia para el almacenamiento. Puede almacenar cada show / season / episode como un elemento (anidado apropiadamente) y atributos de estos elementos como atributos xml en los elementos. Luego puede usar XQuery para obtener información de nuevo.

NOTA: No soy un chico de Python, así que no sé cómo es tu soporte xml.

NOTA 2: querrá hacer un perfil de esto porque será más grande y más lento que la solución que ya tiene. Probablemente si estás haciendo un procesamiento de alto volumen, entonces XML probablemente no sea tu amigo.


No entiendo esta parte aquí:

Esto funcionó 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 plantear la excepción season_not_found)

Hay una manera de hacerlo - llamado:

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

¿Cuál parece ser el problema con eso?


Bartosz / Para aclarar "Esto funcionó bien, pero no había una forma fácil de verificar si se suponía que x [3] [24] existía o no"

x[''some show''][3][24] devolvería la temporada 3, episodio 24 de "algún espectáculo". Si no hubo la temporada 3, quiero que el pseudo-dict aumente tvdb_seasonnot found, si "algún show" no existe, entonces aumente tvdb_shownotfound

El sistema actual de una serie de clases, cada una con un __getitem__ - Show comprueba if self.seasons.has_key(requested_season_number) , la clase Season verifica if self.episodes.has_key(requested_episode_number) y así sucesivamente.

Funciona, pero parece que hay muchos códigos repetidos (cada clase es básicamente la misma, pero genera un error diferente)


OK, lo que necesitas es classobj del nuevo módulo. Eso le permitiría construir clases de excepción dinámicamente ( classobj toma una cadena como argumento para el nombre de la clase).

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

esto te da:

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 clase a través de:

self.__class__.__name__

Por lo tanto, después de un cambio de cadena y concatenación, debería poder obtener el nombre de clase de excepción apropiado y construir un objeto de clase usando ese nombre y luego elevar esa excepción.

PD: también puedes subir cadenas, pero esto está en desuso.

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