Chapitre 4. Le pouvoir de l’introspection

Ce chapitre traite d’une des forces de Python : l’introspection. Comme vous le savez, tout est objet dans Python, l’introspection consiste à considérer des modules et des fonctions en mémoire comme des objets, à obtenir des informations de leur part et à les manipuler. Au cours du chapitre, nous définirons des fonctions sans nom, nous appelerons des fonctions avec les arguments dans le désordre et nous référencerons des fonctions dont nous ne connaissons même pas le nom à l’avance.

4.1. Plonger

Voici un programme Python complet et fonctionnel. Vous devriez en comprendre une grande partie rien qu’en le lisant. Les lignes numérotées illustrent des concepts traités dans Chapitre 2, Votre premier programme Python. Ne vous inquiétez pas si le reste du code a l’air intimidant, vous en apprendrez tous les aspects au cours de ce chapitre.

Exemple 4.1. apihelper.py

Si vous ne l’avez pas déjà fait, vous pouvez télécharger cet exemple ainsi que les autres exemples du livre.


def info(object, spacing=10, collapse=1): 1 2 3
    """Print methods and docstrings.
    
    Takes module, class, list, dictionary, or string."""
    methodList = [method for method in dir(object) if callable(getattr(object, method))]
    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])

if __name__ == "__main__":                4 5
    print info.__doc__
1 Ce module a une fonction, info. Selon sa déclaration de fonction, elle prend trois paramètres : object, spacing et collapse. Les deux derniers sont en fait des paramètres optionnels comme nous le verrons bientôt.
2 La fonction info a une docstring multi-lignes qui décrit succintement son usage. Notez qu’aucune valeur de retour n’est mentionnée, cette fonction sera employée uniquement pour son effet, pas sa valeur.
3 Le code à l’interieur de la fonction est indenté.
4 L’astuce if __name__ permet à ce programme de faire quelque chose d’utile lorsqu’il est exécuté tout seul sans intérférence avec son usage comme module pour d’autres programmes. Dans ce cas, le programme affiche simplement la docstring de la fonction info.
5 L’instruction if utilise == pour la comparaison et ne nécessite pas de parenthèses.

La fonction info est conçue pour être utilisée par vous, le programmeur, lorsque vous travaillez dans l’IDE Python. Elle prend n’importe quel objet qui a des fonctions ou des méthodes (comme un module, qui a des fonction, ou une liste, qui a des méthodes) et affiche les fonctions et leur docstring.

Exemple 4.2. Exemple d'utilisation de apihelper.py

>>> from apihelper import info
>>> li = []
>>> info(li)
append     L.append(object) -- append object to end
count      L.count(value) -> integer -- return number of occurrences of value
extend     L.extend(list) -- extend list by appending list elements
index      L.index(value) -> integer -- return index of first occurrence of value
insert     L.insert(index, object) -- insert object before index
pop        L.pop([index]) -> item -- remove and return item at index (default last)
remove     L.remove(value) -- remove first occurrence of value
reverse    L.reverse() -- reverse *IN PLACE*
sort       L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1

Par défaut, la sortie est formatée pour être facilement lisible. Les docstring multi-lignes sont combinées en une seule longue ligne, mais cette option peut être changée en spécifiant 0 pour l’argument collapse. Si les noms de fonction font plus de 10 caractères, vous pouvez spécifier une valeur plus grande pour l’argument spacing, pour faciliter la lecture.

Exemple 4.3. Utilisation avancée de apihelper.py

>>> import odbchelper
>>> info(odbchelper)
buildConnectionString Build a connection string from a dictionary Returns string.
>>> info(odbchelper, 30)
buildConnectionString          Build a connection string from a dictionary Returns string.
>>> info(odbchelper, 30, 0)
buildConnectionString          Build a connection string from a dictionary
    
    Returns string.