L'avantage de python c'est qu'il est muni de beaucoup de méthodes d'introspection :

Pour avoir la liste des méthodes d'un objet python, on fait comme suit :

import kodipydent
for a in dir(kodipydent):
  print (a)

Ça c'est pour la base, mais bien sur il faut pousser, car certains objets incluent des objets.

Donc pour le cas de kodipydent, pour avoir ce qui nous intéresse vraiment, on instancie l'objet puis on appelle dir sur l'objet contenue dans l'instanciéé :

from kodipydent import Kodi
kodi = Kodi('192.168.1.39')

for method in dir(kodi):
   print (method)

C'est pratique quand vous n'arrivez pas à trouver une doc qui vous liste les méthodes d'une librairie python !

Bref, plus ça va, plus j'aime ce langage, même si en dépit ce que disent les gens, il est tout à fait possible de faire un code difficilement lisible en python, comme cet exemple ci-dessous glané sur le net, qui demande quand même beaucoup de décorticage pour comprendre :

methodList = [e for e in dir(object) if callable(getattr(object, e))]
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
print "\n".join(["%s %s" %
   (method.ljust(spacing)
   processFunc(str(getattr(object, method).__doc__)))
   for method in methodList])

Même si au final, c'est compréhensible, pour ceux qui ne maitrisent pas parfaitement lambda et gettattr et les méthodes dir et doc .... bref, vous voyez bien qu'il y'a une partie qui est porteuse d'arcanes python dans ce code.

Mais c'est surtout l’écriture au kilomètre du join, lijust, callable et lambda avec un "for" passé en argument et non pas en boucle contenante, qui rends tout ca très wow wow bobo tétête !