Fondamentalement, j'ai écrit une API sur www.thetvdb.com en Python. Le code actuel peut être trouvé here.Meilleure façon de résumer les données de saison/émission/épisode
Il saisit les données de l'API comme l'a demandé, et doit stocker les données en quelque sorte, et le rendre disponible en faisant:
print tvdbinstance[1][23]['episodename'] # get the name of episode 23 of season 1
Quelle est la « meilleure » façon de faire abstraction de ces données au sein de la classe Tvdb()
?
I utilisé à l'origine d'une Dict()
prolongée qui a créé automatiquement des sous-dicts (pour que vous puissiez faire x[1][2][3][4] = "something"
sans avoir à faire if x[1].has_key(2): x[1][2] = []
et ainsi de suite)
Ensuite, je viens stockées les données en faisant self.data[show_id][season_number][episode_number][attribute_name] = "something"
Cela a fonctionné ok, mais il n'y avait pas de moyen facile de vérifier si x[3][24]
était censé exister ou non (donc je ne pouvais pas lever l'exception season_not_found).
il est actuellement en utilisant quatre classes: ShowContainer
, Show
, Season
et Episode
. Chacun est un dict très basique, auquel je peux facilement ajouter des fonctionnalités supplémentaires (la fonction search()
sur Show()
par exemple). Chacun a un __setitem__
, __getitem_
et has_key
.
Cela fonctionne très bien, je peux vérifier dans les spectacles si elle a cette saison dans self.data
dict, sinon, raise season_not_found
. Je peux également vérifier Season()
s'il a cet épisode et ainsi de suite.
Le problème est maintenant que cela se présente comme dict, mais ne pas toutes les fonctionnalités, et parce que je suis remplaçant les fonctions __getitem__
et __setitem__
, il est facile d'appeler accidentellement récursive __getitem__
(donc je ne suis pas sûr si l'extension de la classe Dict
provoque des problèmes).
L'autre petit problème est l'ajout de données dans la dict, c'est beaucoup plus de travail que l'ancienne méthode Dict
(qui était self.data[seas_no][ep_no]['attribute'] = 'something'
). Voir _setItem
et _setData
. Ce n'est pas trop mal, car il s'agit actuellement d'une interface API en lecture seule (les utilisateurs de l'API ne devraient donc jamais récupérer de données, pas ajouter plus), mais c'est à peine ... Elégant.
Je pense que le système des séries de classes est probablement le meilleur moyen, mais est-ce que quelqu'un a une meilleure idée pour stocker les données? Et serait étendre les ShowContainer
/etc classes avec Dict
causer des problèmes?