Cel mai bun mod de a colecta date anotimp / spectacol / episod

Practic, am scris un API la www.thetvdb.com în Python. Codul curent poate fi găsit aici .

Câștigă date de la API după cum este cerut și trebuie să stocheze datele într-un fel și să le pună la dispoziție făcând:

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

Care este modalitatea "cea mai bună" de a rezuma aceste date în cadrul clasei Tvdb() ?

Am folosit inițial un cod extins Dict() care a creat automat subdocte (pentru a putea face x [1] [2] [3] fără a fi nevoie să faceți dacă x [1] .has_key (2): x [1] [2] = []

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

Acest lucru a funcționat bine, dar nu a existat o metodă ușoară de verificare dacă x [3] [24] ar fi trebuit să existe sau nu (deci nu am putut ridica excepția season_not_found).

În prezent, utilizează patru clase: ShowContainer , Show , Sezonul și Episode . Fiecare dintre ele este un dict foarte simplu, pe care îl pot adăuga cu ușurință în funcția suplimentară (de exemplu, search() pe Show() ). Fiecare are un __ setitem __ , __ getitem _ și has_key .

Acest lucru funcționează în cea mai mare parte bine, pot verifica în Expoziții dacă are acel sezon în dict self.data , dacă nu, ridica season_not_found . De asemenea, pot verifica Season() dacă are episodul respectiv și așa mai departe.

Problema este acum că ea se prezintă ca dict, dar nu are toată funcționalitatea și pentru că depășesc funcțiile __ getitem __ și __ setitem __ este ușor de accidentat recursiv apelați __ getitem __ (deci nu sunt sigur dacă extinderea clasei Dict va cauza probleme).

Cealaltă problemă ușoară este adăugarea datelor în dict este mult mai mult decât metoda veche Dict (care a fost self.data [seas_no] [ep_no] ['attribute'] = „). Vedeți _setItem și _setData . Nu este prea rău, deoarece în prezent este doar o interfață API numai pentru citire (deci utilizatorii API ar trebui să recupereze numai date, nu să mai adauge mai mult), dar este greu ... Elegant.

Cred că sistemul de serii de clasă este probabil cel mai bun mod, dar are cineva o idee mai bună pentru stocarea datelor? Și ar extinde clasele ShowContainer / etc cu Dict provoca probleme?

0
fr hi bn

5 răspunsuri

Am făcut ceva similar în trecut și am folosit un document xml în memorie ca o bază de date ierarhică rapidă și murdară pentru stocare. Puteți memora fiecare spectacol / anotimp / episod ca element (imbricat în mod corespunzător) și atribute ale acestor lucruri ca atribute xml pe elemente. Apoi puteți folosi XQuery pentru a obține informații înapoi.

NOTE: I'm not a Python guy so I don't know what your xml support is like.

NOTE 2: You'll want to profile this because it'll be bigger and slower than the solution you've already got. Likely enough if you are doing some high-volume processing then xml is probably not going to be your friend.

0
adăugat

Bartosz / Pentru a clarifica "Acest lucru a funcționat bine, dar nu a existat o modalitate ușoară de a verifica dacă x [3] [24] ar fi trebuit să existe sau nu"

x['some show'][3][24] would return season 3, episode 24 of "some show". If there was no season 3, I want the pseudo-dict to raise tvdb_seasonnotfound, if "some show" doesn't exist, then raise tvdb_shownotfound

Sistemul actual al unei serii de clase, fiecare cu un __ getitem __ - arata cecurile daca auto.seasons.has_key (required_season_number) , clasa Sezonii verifica daca este sine. episodes.has_key (numarul solicitat_episode) si asa mai departe.

Funcționează, dar se pare că există o mulțime de cod repetat (fiecare clasă este în esență aceeași, dar ridică o altă eroare)

0
adăugat

Nu primesc partea asta aici:

Acest lucru a funcționat bine, dar nu a existat o modalitate ușoară de a verifica dacă x [3] [24] ar fi trebuit să existe sau nu (deci nu am putut ridica excepția season_not_found)

Există o modalitate de ao face - numită în :

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

ce pare a fi problema cu asta?

0
adăugat

OK, ceea ce aveți nevoie este classobj din noul modul. Acest lucru vă va permite să construiți dinamic clase de excepție ( classobj are un șir ca argument pentru numele clasei).

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

aceasta vă oferă:

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

amintiți-vă că puteți obține întotdeauna numele clasei prin:

self.__class__.__name__

Deci, după un șir de șir și concatenare, ar trebui să puteți obține un nume de clasă excepțional și să construiți un obiect de clasă utilizând acest nume și apoi să ridicați această excepție.

P.S. - puteți ridica, de asemenea, siruri de caractere, dar acest lucru este depreciat.

raise(self.__class__.__name__+"Exception")
0
adăugat

Why not use SQLite? There is good support in Python and you can write SQL queries to get the data out. Here is the Python docs for sqlite3


Dacă nu doriți să utilizați SQLite, puteți face o serie de dicte.

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

Astfel, adăugați metadate la orice înregistrare și căutați foarte ușor

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'])
0
adăugat
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.