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.
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):
"""Print methods and doc strings.
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__":
print info.__doc__
|
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.
|
|
La fonction info a une doc string
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.
|
|
Le code à l’interieur de la fonction est indenté.
|
|
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 doc string de la fonction info.
|
|
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 doc string.
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 doc string 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.