Лучший способ абстрагироваться сезон / шоу данных / эпизода

голоса
13

В принципе, я написал API для www.thetvdb.com в Python. Текущий код можно найти здесь .

Она захватывает данные из API в соответствии с просьбой, и должен хранить данные каким-то образом, и сделать его доступным, выполнив:

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

Что такое «лучший» способ абстрагировать эти данные в Tvdb()классе?

Первоначально я использовал расширенный , Dict()который автоматически созданные суб-dicts (так что вы могли бы сделать x[1][2][3][4] = somethingбез того , чтобы сделать if x[1].has_key(2): x[1][2] = []и так далее)

Тогда я просто хранить данные, выполнив self.data[show_id][season_number][episode_number][attribute_name] = something

Это работало хорошо, но не было простой способ проверки , если x[3][24]должно было существовать или нет (так что я не мог поднять исключение season_not_found).

В настоящее время она использует четыре класса: ShowContainer, Show, Seasonи Episode. Каждый из них является очень простым ДИКТ, который я могу легко добавить дополнительную функциональность (в search()зависимости от Show(), например). В каждом номере есть __setitem__, __getitem_и has_key.

Это работает в основном хорошо, я могу проверить в шоу , если он имеет тот сезон в это self.dataСловаре, если нет, то raise season_not_found. Я могу также проверить в , Season()если он имеет этот эпизод и так далее.

Проблема теперь он представляет себя как Dict, но не все функциональные возможности , а потому , что я переопределение __getitem__и __setitem__функции, это легко случайно рекурсивный вызов __getitem__(так что я не уверен , что расширение Dictкласса вызывает проблемы ).

Другая небольшая проблема при добавлении данных в Словарь намного больше работы , чем старый Dictметод (который был self.data[seas_no][ep_no]['attribute'] = 'something'). См _setItemи _setData. Это не так уж плохо, так как это в настоящее время только для чтения только API - интерфейс (так пользователи API должны всегда получать данные, не добавляйте больше), но это вряд ли ... Elegant.

Я думаю , что система последовательно из-классов, вероятно, лучший способ, но кто - нибудь есть лучшая идея для хранения данных? И будет расширение ShowContainer/ и т.д. классы с Dictпроблемами вызывают?

Задан 08/08/2008 в 13:05
источник пользователем
На других языках...                            


5 ответов

голоса
3

Почему бы не использовать SQLite? Существует хорошая поддержка в Python , и вы можете писать запросы SQL , чтобы получить данные из. Вот Документы Python для sqlite3


Если вы не хотите использовать SQLite вы могли бы сделать массив dicts.

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

Таким образом, вы добавления метаданных к любой записи и найти его очень легко

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'])
Ответил 08/08/2008 в 15:45
источник пользователем

голоса
0

Я сделал что-то подобное в прошлом и использовал XML-документ в памяти, как быстрые и грязные иерархическая база данных для хранения. Вы можете хранить каждое шоу / сезон / эпизод как элемент (вложено соответствующим образом) и атрибуты этих вещей, как XML атрибуты элементов. Затем вы можете использовать XQuery, чтобы получить информацию обратно.

Примечание: Я не Python парень , так что я не знаю , что ваша поддержка XML, как.

Примечание 2: Вы хотите , чтобы профиль этого , потому что это будет больше и медленнее , чем решение , которое вы уже получили. Скорее всего , достаточно , если вы делаете некоторую обработку большого объема , то XML, вероятно , не будет вашим другом.

Ответил 09/08/2008 в 14:13
источник пользователем

голоса
0

Я не получаю эту часть здесь:

Это работало хорошо, но не было простой способ проверки, если х [3] [24] должен был существовать или нет (так что я не мог поднять исключение season_not_found)

Существует способ сделать это - называется в :

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

то, что, как представляется, проблема с этим?

Ответил 11/08/2008 в 19:07
источник пользователем

голоса
0

Бартош / Для уточнения «Это работало хорошо, но не было простой способ проверки, если х [3] [24] должен был существовать или нет»

x['some show'][3][24]вернется сезон 3, эпизод 24 из «какой-шоу». Если бы не было никакого сезона 3, я хочу псевдо-ДИКТ поднять tvdb_seasonnotfound, если «некоторые шоу» не существует, а затем поднимите tvdb_shownotfound

Действующая система серии классов, каждый с __getitem__- Показать чеки if self.seasons.has_key(requested_season_number), чеки класса Season if self.episodes.has_key(requested_episode_number)и так далее.

Он работает, но там, кажется, много повторяющегося кода (каждый класс в основном то же самое, но возникает другая ошибка)

Ответил 12/08/2008 в 16:55
источник пользователем

голоса
5

Хорошо, что вам нужно classobjот нового модуля. Это позволит вам построить классы исключений динамически ( classobjпринимает строку в качестве аргумента для имени класса).

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

это дает вам:

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

помните, что вы всегда можете получить имя класса через:

self.__class__.__name__

Таким образом, после некоторой строки коверкая и конкатенации, вы должны быть в состоянии получить соответствующее имя класса исключения и построить объект класса, используя это имя, а затем поднять это исключение.

PS - вы также можете поднять строки, но это не рекомендуется.

raise(self.__class__.__name__+"Exception")
Ответил 14/08/2008 в 06:08
источник пользователем

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