В принципе, я написал 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
вызвать проблемы?