Domanda

Fondamentalmente, ho scritto un API per www.thetvdb.com in Python.L'attuale codice può essere trovato qui.

Afferra i dati dalle API, come richiesto, e ha per memorizzare i dati in qualche modo, e renderlo disponibile con:

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

Che cosa è la "migliore" in senso astratto di questo tipo di dati all'interno del Tvdb() classe?

Originariamente ho usato un esteso Dict() che creato automaticamente sub-dicts (così si potrebbe fare x[1][2][3][4] = "something" senza dover fare if x[1].has_key(2): x[1][2] = [] e così via)

Poi ho memorizzato i dati da fare self.data[show_id][season_number][episode_number][attribute_name] = "something"

Questo ha funzionato bene, ma non c'era modo semplice per controllare se x[3][24] doveva esistere o meno (e quindi non potevo alzare il season_not_found eccezione).

Attualmente usando quattro classi: ShowContainer, Show, Season e Episode.Ognuno è molto semplice dict, che posso aggiungere facilmente funzionalità extra (il search() funzione Show() per fare un esempio).Ognuno ha un __setitem__, __getitem_ e has_key.

Questo funziona per lo più bene, posso controllare in Mostra se si ha a che stagione è self.data dict, se non, raise season_not_found.Posso anche check-in Season() se ha quell'episodio e così via.

Ora il problema si presenta se stesso come un dict, ma non ha tutte le funzionalità, e perché sto ignorando l' __getitem__ e __setitem__ funzioni, è facile accidentalmente chiamata ricorsivamente __getitem__ (non so se si estende il Dict classe causare problemi).

Altro piccolo problema è l'aggiunta di dati in dict è un sacco di lavoro in più rispetto al vecchio Dict metodo (che è stato self.data[seas_no][ep_no]['attribute'] = 'something').Vedere _setItem e _setData.Non è troppo male, dato che è attualmente solo in sola lettura API (interfaccia di modo che gli utenti delle API dovrebbe sempre e solo recuperare i dati, per non aggiungere altro), ma non è certo...Elegante.

Penso che la serie di classi di sistema è probabilmente il modo migliore, ma qualcuno ha un'idea migliore per memorizzare i dati?E ampliare il ShowContainer/etc classi con Dict causare problemi?

È stato utile?

Soluzione

OK, che cosa avete bisogno è classobj dal nuovo modulo.Che consentono di costruire classi di eccezione in modo dinamico (classobj prende una stringa come argomento per il nome della classe).

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

questo ti dà:

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

ricordate che si può sempre ottenere il nome della classe attraverso:

self.__class__.__name__

Così, dopo qualche stringa di alterazione e di concatenazione, si dovrebbe essere in grado di ottenere le dovute eccezioni nome della classe e la costruzione di un oggetto di classe, utilizzando quel nome e poi sollevare l'eccezione.

P. S.- è inoltre possibile aumentare le corde, ma questo è deprecato.

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

Altri suggerimenti

Perché non usare SQLite?C'è un buon supporto in Python e si può scrivere query SQL per ottenere i dati fuori.Qui è il Python documenti per sqlite3


Se non si desidera utilizzare SQLite si potrebbe fare un array di dicts.

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

Che modo è possibile aggiungere i metadati per ogni record e di ricerca molto facilmente

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

Ho fatto qualcosa di simile in passato e utilizzato in memoria un documento XML come un rapido e sporco gerarchiche di database per l'archiviazione.È possibile memorizzare ogni spettacolo/stagione/episodio come un elemento nidificato in modo appropriato) e gli attributi di queste cose come attributi xml sugli elementi.Quindi è possibile utilizzare il linguaggio XQuery per ottenere informazioni indietro.

NOTA: Io non sono un Pitone ragazzo, quindi non so che cosa il vostro supporto xml è come.

NOTA 2: Avrai voglia di profilo questo perché sarà più grande e più lento rispetto alla soluzione che hai già ottenuto.Abbastanza probabile se si sta facendo qualche alto volume di elaborazione XML probabilmente non sta per essere tuo amico.

Non capisco questa parte qui:

Questo ha funzionato bene, ma non c'era modo semplice per controllare se x[3][24] doveva esistere o meno (e quindi non potevo alzare il season_not_found eccezione)

C'è un modo per farlo, e chiamato in:

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

quello che sembra essere il problema?

Bartosz/A chiarire "Questo ha funzionato bene, ma non c'era modo semplice per controllare se x[3][24] doveva esistere o meno"

x['some show'][3][24] sarebbe tornato stagione 3, episodio 24 "alcuni show".Se non c'era la stagione 3, voglio pseudo-dict per aumentare tvdb_seasonnotfound, se "qualche" non esiste, quindi sollevare tvdb_shownotfound

Il sistema attuale di una serie di classi, ognuna con un __getitem__ - Mostra controlli if self.seasons.has_key(requested_season_number), la Stagione della classe verifica if self.episodes.has_key(requested_episode_number) e così via.

Funziona, ma ci sembra essere un sacco di codice ripetuto (ogni classe è fondamentalmente la stessa, ma genera un errore diverso)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top