soyut sezon / Gösterim / bölüm verilerine en iyi yolu

oy
13

Temelde, Python içinde www.thetvdb.com için bir API yazdım. Geçerli kod bulunabilir burada .

Bu istendiği gibi API verileri yakalar ve yaparak nasılsa veri depolamak ve kullanılabilir hale getirmek zorundadır:

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

Soyut için en iyi yol içinde bu veri nedir Tvdb()sınıfın?

Başlangıçta bir genişletilmiş kullanılan Dict()(böylece yapabileceği otomatik oluşturulan alt dicts o x[1][2][3][4] = somethingyapmak zorunda kalmadan if x[1].has_key(2): x[1][2] = []böyle devam eder)

Sonra ben sadece yaparak verileri saklanan self.data[show_id][season_number][episode_number][attribute_name] = something

Bu tamam çalıştı, ancak eğer kontrol etmenin kolay bir yolu yoktu x[3][24](yani season_not_found istisna açabilecek değil) mevcut gerekiyordu ya değildi.

Şu anda dört sınıf kullanıyor: ShowContainer, Show, Seasonve Episode. Her biri kolayca (ekstra işlevler ekleyebilirsiniz çok temel bir dict olduğunu search()üzerine fonksiyonu Show()örneğin). Her bir vardır __setitem__, __getitem_ve has_key.

Bu o en o sezonu varsa, ben Şovları kontrol edebilirsiniz çoğunlukla çalışıyor self.datadict değilse, raise season_not_found. Ben de kontrol edebilirsiniz Season()o kadar o bölümü varsa ve.

Sorun şimdi bir dict kendisini anlatacak, ama bütün işlevselliğe sahip değil ve ben geçersiz kılma olduğum için __getitem__ve __setitem__işlevleri, yanlışlıkla yinelemeli aramak çok kolaydır __getitem__uzanan eğer öyleyse emin değilim ( Dictsınıf sorunlara neden olur ).

Diğer hafif bir sorun dict veri ekliyor eski çok daha fazla çalışmadır Dict(idi yöntemiyle self.data[seas_no][ep_no]['attribute'] = 'something'). Bkz _setItemve _setData. Sadece salt okunur API arayüzü (böylece API kullanıcıların sadece hiç daha eklemek, veri değil almak olmalı) şu anda var, çünkü çok kötü değil, ama neredeyse ... Zarif bu.

Ben serisi-of-sınıfları sistemi muhtemelen en iyi yol olduğunu düşünüyoruz, ama herkes verilerini depolamak için daha iyi bir fikir var mı? Ve uzanan olurdu ShowContainerile / etc sınıfları Dictneden sorunların?

Oluştur 08/08/2008 saat 13:05
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
3

Neden SQLite'ı kullanmak? Orada Python iyi bir destek olduğunu ve veriyi almak için SQL sorguları yazabilir. İşte için Python dokümanlar olduğu sqlite3


Eğer SQLite'ı kullanmak istemiyorsanız size dicts dizisi yapabilirdi.

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

Bu şekilde, herhangi bir kayda meta verileri eklemek ve çok kolay bir şekilde arama

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'])
Cevap 08/08/2008 saat 15:45
kaynak kullanıcı

oy
0

Geçmişte benzer bir şey yapmış ve depolama için hızlı ve kirli hiyerarşik veritabanı olarak bir bellek içi XML belgesi kullandık. xml elemanlarında niteliklerini gibi bir elementin (uygun şekilde iç içe) ve bu şeylerin nitelikleri olarak her göstermek / sezon / bölüm saklayabilir. Sonra tekrar dışarı bilgi almak için XQuery kullanabilirsiniz.

NOT: Ben xml desteği nasıl bir şey olduğunu bilmiyorum o yüzden bir Python adam değilim.

NOT 2: Bu da zaten var çözümü daha büyük ve daha yavaş olacak çünkü profil isteyeceksiniz. Olasılıkla yeterince sonra bazı yüksek hacimli işlem yapıyorsanız XML muhtemelen arkadaşınız olacak değildir.

Cevap 09/08/2008 saat 14:13
kaynak kullanıcı

oy
0

Ben burada bu bölümden alamadım:

Bu tamam çalıştı, ancak x [3] [24] yok veya gerekiyordu, denetimi kolay yolu yoktu (yani season_not_found istisna yükseltmek olabilir)

Bunu yapmanın bir yolu yoktur - denilen in :

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

ne anlama sorun olarak görünüyor?

Cevap 11/08/2008 saat 19:07
kaynak kullanıcı

oy
0

Bartosz / netleştirmek için "tamam çalıştı, ama x [3] [24] var olmaması gerekiyor ya da değil, denetimi kolay bir yolu yoktu"

x['some show'][3][24]sezon 3, "Bazı gösterisi" nin bölüm 24 döndürecektir. Hiçbir sezon 3 olsaydı, ben "Bazı göstermek" yoksa, o zaman tvdb_shownotfound yükseltmek, sözde dict tvdb_seasonnotfound yükseltmek istiyorum

Sınıfların bir dizi mevcut sistem, bir her __getitem__- Show çekler if self.seasons.has_key(requested_season_number), Sezon sınıf kontrolleri if self.episodes.has_key(requested_episode_number)vb vb.

O çalışır, ancak tekrarlanan kod bir sürü var gibi görünüyor (her sınıf temelde aynıdır, ancak farklı bir hata yükseltir)

Cevap 12/08/2008 saat 16:55
kaynak kullanıcı

oy
5

Tamam, ne ihtiyaç vardır classobjyeni modülünden. Yani dinamik istisna sınıflarını oluşturmak için izin (olurdu classobjsınıf adı için bir argüman olarak bir dize alır).

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

Bu verir:

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

Her zaman sınıf adını geçmek unutmayın:

self.__class__.__name__

Yani, bazı dize bozma ve birleştirme sonrasında, uygun istisna sınıf adını almak ve bu adı kullanarak bir sınıf nesnesi oluşturmak ve sonra da bu durum yükseltmek gerekir.

PS - Ayrıca dizeleri artırabilir, ancak bu kullanımdan kaldırılmıştır.

raise(self.__class__.__name__+"Exception")
Cevap 14/08/2008 saat 06:08
kaynak kullanıcı

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