Beste måten å abstrahere sesong / vise / episode data

stemmer
13

I utgangspunktet har jeg skrevet et API for å www.thetvdb.com i Python. Den nåværende koden finner du her .

Det griper data fra API som forespurt, og har til å lagre data eller annen måte, og gjøre det tilgjengelig ved å gjøre:

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

Hva er den beste måten å abstrahere disse dataene i Tvdb()klassen?

Jeg opprinnelig brukt en utvidet Dict()som automatisk opprettes under dicts (slik at du kan gjøre x[1][2][3][4] = somethinguten å måtte gjøre if x[1].has_key(2): x[1][2] = []og så videre)

Så jeg bare lagret data ved å gjøre self.data[show_id][season_number][episode_number][attribute_name] = something

Dette fungerte greit, men det var ingen enkel måte å sjekke om x[3][24]skulle eksistere eller ikke (slik at jeg ikke kunne heve season_not_found unntak).

Foreløpig er det med fire klasser: ShowContainer, Show, Seasonog Episode. Hver av dem er en meget grunnleggende dict, som jeg lett kan legge til ekstra funksjonalitet i (den search()funksjon på Show()for eksempel). Hver har en __setitem__, __getitem_og has_key.

Dette fungerer stort sett bra, kan jeg sjekke inn Viser om det har denne sesongen i sin self.datadict, hvis ikke, raise season_not_found. Jeg kan også sjekke inn Season()hvis den har den episoden og så videre.

Problemet nå er det å presentere seg selv som en dict, men har ikke all funksjonaliteten, og fordi jeg overstyrer __getitem__og __setitem__funksjoner, er det lett å tilfeldigvis rekursivt ringe __getitem__(så jeg er ikke sikker på om å utvide Dictklassen vil føre til problemer ).

Det andre svak problemet er å legge inn data i dict er mye mer arbeid enn den gamle Dictmetode (som var self.data[seas_no][ep_no]['attribute'] = 'something'). Se _setItemog _setData. Det er ikke så ille, siden det er foreløpig bare en skrivebeskyttet API-grensesnitt (slik at brukerne av API bare skal hente data, ikke legge til mer), men det er neppe ... Elegant.

Jeg tror serien-of-klasser system er sannsynligvis den beste måten, men er det noen som har en bedre idé for lagring av data? Og ville utvide ShowContainer/ etc klasser med Dictforårsake problemer?

Publisert på 08/08/2008 klokken 14:05
kilden bruker
På andre språk...                            


5 svar

stemmer
5

OK, det du trenger er classobjfra ny modul. Som ville tillate deg å lage unntak klasser dynamisk ( classobjtar en streng som argument for klassenavnet).

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

dette gir deg:

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

Husk at du alltid kan få navnet klassen gjennom:

self.__class__.__name__

Så, etter noen streng mangling og sammensetning, bør du være i stand til å skaffe passende unntak klasse navn og konstruere en klasse objekt med det navnet, og deretter heve det unntak.

PS - du kan også øke strenger, men dette er foreldet.

raise(self.__class__.__name__+"Exception")
Svarte 14/08/2008 kl. 07:08
kilden bruker

stemmer
3

Hvorfor ikke bruke SQLite? Det er god støtte i Python, og du kan skrive SQL-spørringer for å få data ut. Her er de Python docs for sqlite3


Hvis du ikke ønsker å bruke SQLite du kan gjøre en rekke dicts.

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

På den måten legge til metadata til noen registrering og søk det veldig lett

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'])
Svarte 08/08/2008 kl. 16:45
kilden bruker

stemmer
0

Bartosz / For å klargjøre "Dette fungerte greit, men det var ingen enkel måte å sjekke om x [3] [24] skulle eksistere eller ikke"

x['some show'][3][24]vil returnere sesong 3, episode 24 av "noen show". Hvis det ikke var sesong 3, jeg vil at pseudo-dict å heve tvdb_seasonnotfound, hvis "noen show" ikke eksisterer, deretter øke tvdb_shownotfound

Dagens system med en rekke klasser, hver med en __getitem__- Vis kontroller if self.seasons.has_key(requested_season_number), sesongen klasse sjekker if self.episodes.has_key(requested_episode_number)og så videre.

Det fungerer, men det det ser ut til å være mye av gjentatte kode (hver klasse er i utgangspunktet det samme, men hever en annen feil)

Svarte 12/08/2008 kl. 17:55
kilden bruker

stemmer
0

Jeg får ikke denne delen her:

Dette fungerte greit, men det var ingen enkel måte å sjekke om x [3] [24] skulle eksistere eller ikke (så jeg kunne ikke heve season_not_found unntak)

Det er en måte å gjøre det - kalt inn :

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

hva synes å være problemet med det?

Svarte 11/08/2008 kl. 20:07
kilden bruker

stemmer
0

Jeg har gjort noe lignende tidligere, og brukt en in-memory XML-dokument som en rask og skitne hierarkisk database for lagring. Du kan lagre hvert show / sesong / episode som et element (nestet riktig) og attributter av disse tingene som xml attributter på elementene. Deretter kan du bruke XQuery for å få info ut igjen.

MERK: Jeg er ikke en Python fyr, så jeg vet ikke hva din xml støtte er like.

MERK 2: Det er lurt å profilere dette fordi det vil bli større og tregere enn den løsningen du allerede har. Sannsynligvis nok hvis du gjør noen høy-volum behandling deretter XML er sannsynligvis ikke kommer til å være din venn.

Svarte 09/08/2008 kl. 15:13
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more