В принципе, я написал 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. Каждый из них является очень простым dict, который я могу легко добавить в функциональность (например, search() на Show()). Каждый из них имеет __setitem__, __getitem_ и has_key.
Это работает в основном отлично, я могу проверить шоу, если в нем есть этот сезон self.data dict, если нет, raise season_not_found. Я также могу проверить Season(), если у него есть этот эпизод и т.д.
Теперь проблема заключается в том, что она представляет собой dict, но не имеет всех функциональных возможностей, и потому что я переопределяю функции __getitem__ и __setitem__, это легко случайно рекурсивно вызывает __getitem__ (так Я не уверен, что расширение класса Dict вызовет проблемы).
Другая небольшая проблема заключается в том, что добавление данных в dict намного больше, чем старый Dict метод (который был self.data[seas_no][ep_no]['attribute'] = 'something'). См. _setItem и _setData. Это не так уж плохо, так как в настоящее время это только интерфейс API только для чтения (поэтому пользователи API должны только извлекать данные, а не добавлять больше), но это вряд ли... Элегантный.
Я думаю, что система серии классов, вероятно, лучший способ, но есть ли у кого-нибудь лучшее представление для хранения данных? И будет ли расширение ShowContainer/etc классов с Dict вызвать проблемы?