По сути, я написал API для www.thetvdb.com на Python. Текущий код можно найти здесь .
Он получает данные из API в соответствии с запросом, должен каким-то образом хранить данные и сделать их доступными, выполнив:
print tvdbinstance[1][23]['episodename'] # get the name of episode 23 of season 1
Каков «лучший» способ абстрагирования этих данных в классе Tvdb()
?
Первоначально я использовал расширенный Dict()
, который автоматически создавал поддикты (так что вы можете сделать 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
.
Это работает в основном нормально, я могу проверить в Shows, есть ли этот сезон в self.data
dict, если нет, raise season_not_found
. Я также могу проверить Season()
, есть ли этот эпизод и т. Д.
Проблема теперь в том, что он представляет себя как диктовку, но не обладает всеми функциями, и, поскольку я переопределяю функции __getitem__
и __setitem__
, легко случайно вызвать рекурсивный вызов __getitem__
(так Я не уверен, что расширение класса Dict
вызовет проблемы).
Другая небольшая проблема - добавление данных в dict - намного больше работы, чем старый метод Dict
(который был self.data[seas_no][ep_no]['attribute'] = 'something'
). См. _setItem
и _setData
. Это не так уж плохо, поскольку в настоящее время это только API-интерфейс только для чтения (поэтому пользователям API следует только извлекать данные, а не добавлять больше), но это вряд ли ... Элегантно.
Я думаю, что система серий классов, вероятно, является лучшим способом, но у кого-нибудь есть лучшая идея для хранения данных? И может ли расширение классов ShowContainer
/ etc с Dict
вызвать проблемы?