You are here: Sommaire > Plongez au coeur de Python > Le pouvoir de l’introspection > Assembler les pièces | << >> | ||||
Plongez au coeur de PythonDe débutant à expert |
La dernière ligne du code, la seule que nous n’ayons pas encore déconstruite, est celle qui fait tout le travail. Mais arrivé à ce point, le travail est simple puisque tous les éléments dont nous avons besoin sont disponibles. Les dominos sont en place, il ne reste qu’à les faire tomber.
Voici le plat de résistance de apihelper.py:
print "\n".join(["%s %s" % (method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList])
Notez que ce n’est qu’une commande, répartie sur plusieurs lignes sans utiliser le caractère de continuation («\»). Vous vous rappelez quand j’ai dit que certaines expressions peuvent être divisées en plusieurs lignes sans utiliser de backslash ? Une list comprehension est une expression de ce type car toute l’expression est entourée de crochets.
Maintenant étudions l’expression de la fin vers le début. L'instruction
for method in methodList
nous montre qu’il s’agit d’une list comprehension. Comme vous le savez, methodList est une liste de toutes les méthodes qui nous intéressent dans object. Nous parcourons donc cette liste avec method.
>>> import odbchelper >>> object = odbchelper >>> method = 'buildConnectionString' >>> getattr(object, method) <function buildConnectionString at 010D6D74> >>> print getattr(object, method).__doc__ Build a connection string from a dictionary of parameters. Returns string.
Dans la fonction info, object est l’objet pour lequel nous demandons de l’aide, passé en argument. | |
Pendant que nous parcourons la methodList, method est le nom de la méthode en cours. | |
En utlisant la fonction getattr, nous obtenons une référence à la fonction method du module object. | |
Maintenant, afficher la docstring de la méthode est facile. |
La pièce suivante du puzzle est l’utilisation de str sur la docstring. Comme vous vous rappelez peut-être, str est une fonction prédéfinie pour convertir des données en chaîne. Mais une docstring est toujours une chaîne, alors pourquoi utiliser str ? La réponse est que toutes les fonctions n’ont pas de docstring, et que l’attribut __doc__ de celles qui n’en ont pas renvoi None.
>>> >>> def foo(): print 2 >>> >>> foo() 2 >>> >>> foo.__doc__ >>> foo.__doc__ == None True >>> str(foo.__doc__) 'None'
En SQL, vous devez utiliser IS NULLmethod au lieu de = NULL pour la comparaison d’une valeur nulle. En Python, vous pouvez utiliser aussi bien == None que is None, mais is None est plus rapide. |
Maintenant que nous sommes sûrs d’obtenir une chaîne, nous pouvons passer la chaîne à processFunc, que nous avons déjà défini comme une fonction qui replie ou non les espace. Maintenant vous voyez qu’il était important d’utiliser str pour convertir une valeur None en une représentation en chaîne. processFunc attend une chaîne comme argument et appelle sa méthode split, ce qui échouerait si nous passions None, car None n’a pas de méthode split.
En remontant en arrière encore plus loin, nous voyons que nous utilisons encore le formatage de chaîne pour concaténer la valeur de retour de processFunc avec celle de la méthode ljust de method. C’est une nouvelle méthode de chaîne que nous n’avons pas encore rencontré.
>>> s = 'buildConnectionString' >>> s.ljust(30) 'buildConnectionString ' >>> s.ljust(20) 'buildConnectionString'
Nous avons presque terminé. Ayant obtenu le nom de méthode complété d’espaces de la méthode ljust et la docstring (éventuellement repliée sur une ligne) de l’appel à processFunc, nous concaténons les deux pour obtenir une seule chaîne. Comme nous faisons une mutation de methodList, nous obtenons une liste de chaînes. En utlisant la méthode join de la chaîne "\n", nous joignons cette liste en une chaîne unique, avec chaque élément sur une ligne et affichons le résultat..
C’est la dernière pièce du puzzle. Le code devrait maintenant être parfaitement compréhensible.
print "\n".join(["%s %s" % (method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList])
<< Utiliser des fonctions lambda |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
Résumé >> |