J'ai un module python installé sur mon système et j'aimerais pouvoir voir quelles fonctions / classes / méthodes y sont disponibles.
Je veux appeler la fonction doc sur chacun d'eux. En ruby, je peux faire quelque chose comme ClassName.methods pour obtenir une liste de toutes les méthodes disponibles sur cette classe. Y a-t-il quelque chose de similaire en python?
par exemple. quelque chose comme:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
python
reflection
module
inspect
Chris Gow
la source
la source
Réponses:
Le
inspect
module. Voir également lepydoc
module, lahelp()
fonction dans l'interpréteur interactif et l'pydoc
outil de ligne de commande qui génère la documentation que vous recherchez. Vous pouvez simplement leur donner la classe dont vous souhaitez voir la documentation. Ils peuvent également générer, par exemple, une sortie HTML et l'écrire sur le disque.la source
ast
module dans certaines situations dans ma réponse .dir
pour renvoyer des fonctions et des variables; utiliserinspect
pour filtrer les fonctions uniquement; et utiliserast
pour analyser sans importer.Vous pouvez utiliser
dir(module)
pour voir toutes les méthodes / attributs disponibles. Consultez également PyDocs.la source
dir()
fonction «tente de produire les informations les plus pertinentes, plutôt que complètes». Source: docs.python.org/library/functions.html#dir .inspect
.Une fois que vous avez
import
édité le module, vous pouvez simplement faire:... Pour obtenir les documents sur toutes les fonctions à la fois, de manière interactive. Ou vous pouvez utiliser:
... Pour lister simplement les noms de toutes les fonctions et variables définies dans le module.
la source
inspect
module peut également répertorier les variables, même si cela n'est pas explicitement demandé ici. Cette solution ne nécessite que des objets intégrés, ce qui peut être très utile dans certains cas où Python est installé dans un environnement contraint / verrouillé / cassé.dir
cela imprimerait les résultats, mais il semble que vous deviez le faireprint(dir(modulename))
.Un exemple avec inspect:
getmembers renvoie une liste de tuples (nom_objet, type_objet).
Vous pouvez remplacer isfunction par l'une des autres fonctions isXXX du module d'inspection.
la source
getmembers
peut prendre un prédicat, donc votre exemple pourrait également être écrit:functions_list = [o for o in getmembers(my_module, isfunction)]
functions_list = getmembers(my_module, predicate)
car elle renvoie déjà une liste;)la source
Par souci d'exhaustivité, je voudrais souligner que parfois vous pouvez vouloir analyser le code au lieu de l'importer. Un
import
va exécuter des expressions de haut niveau, et qui pourrait être un problème.Par exemple, je laisse les utilisateurs sélectionner des fonctions de point d'entrée pour les packages créés avec zipapp . Utiliser
import
etinspect
risquer d'exécuter du code erroné, conduisant à des plantages, à l'impression de messages d'aide, à l'apparition de boîtes de dialogue GUI, etc.Au lieu de cela, j'utilise le module ast pour répertorier toutes les fonctions de niveau supérieur:
En mettant ce code
list.py
et en utilisant lui-même comme entrée, j'obtiens:Bien sûr, la navigation dans un AST peut parfois être délicate, même pour un langage relativement simple comme Python, car l'AST est assez bas. Mais si vous avez un cas d'utilisation simple et clair, c'est à la fois faisable et sûr.
Cependant, un inconvénient est que vous ne pouvez pas détecter les fonctions générées au moment de l'exécution, comme
foo = lambda x,y: x*y
.la source
__version__
etc.). Y a-t-il un moyen de l'obtenir?Pour le code que vous ne souhaitez pas analyser, je recommande l'approche basée sur AST de @csl ci-dessus.
Pour tout le reste, le module d'inspection est correct:
Cela donne une liste de 2 tuples dans le formulaire
[(<name:str>, <value:function>), ...]
.La réponse simple ci-dessus est suggérée dans diverses réponses et commentaires, mais n'est pas explicitement citée.
la source
Ça fera l'affaire:
Cependant, si vous trouvez ennuyeux de lire la liste retournée, utilisez simplement la boucle suivante pour obtenir un nom par ligne.
la source
inspect
. En outre, en quoi est-ce différent de la réponse de @ DanLenski?dir(module)
est le moyen standard lors de l'utilisation d'un script ou de l'interpréteur standard, comme mentionné dans la plupart des réponses.Cependant, avec un shell python interactif comme IPython, vous pouvez utiliser la complétion de tabulation pour obtenir une vue d'ensemble de tous les objets définis dans le module. C'est beaucoup plus pratique que d'utiliser un script et
print
de voir ce qui est défini dans le module.module.<tab>
vous montrera tous les objets définis dans le module (fonctions, classes, etc.)module.ClassX.<tab>
vous montrera les méthodes et les attributs d'une classemodule.function_xy?
oumodule.ClassX.method_xy?
vous montrera la docstring de cette fonction / méthodemodule.function_x??
oumodule.SomeClass.method_xy??
vous montrera le code source de la fonction / méthode.la source
Pour les fonctions globales
dir()
c'est la commande à utiliser (comme mentionné dans la plupart de ces réponses), mais elle répertorie à la fois les fonctions publiques et les fonctions non publiques.Par exemple en cours d'exécution:
Renvoie des fonctions / classes comme:
Certains d'entre eux ne sont généralement pas destinés à une utilisation générale de la programmation (mais par le module lui-même, sauf dans le cas de DunderAliases comme
__doc__
,__file__
ect). Pour cette raison, il peut ne pas être utile de les répertorier avec les public (c'est ainsi que Python sait quoi obtenir lors de l'utilisationfrom module import *
).__all__
pourrait être utilisé pour résoudre ce problème, il renvoie une liste de toutes les fonctions et classes publiques dans un module (celles qui ne commencent pas par des traits de soulignement -_
). Voir Quelqu'un peut-il expliquer __all__ en Python? pour l'utilisation de__all__
.Voici un exemple:
Toutes les fonctions et classes avec des traits de soulignement ont été supprimées, ne laissant que celles qui sont définies comme publiques et peuvent donc être utilisées via
import *
.Notez que ce
__all__
n'est pas toujours défini. S'il n'est pas inclus, unAttributeError
est levé.Un cas de ceci est avec le module ast:
la source
Aucune de ces réponses ne fonctionnera si vous ne parvenez pas à importer ledit fichier Python sans erreurs d'importation. Ce fut le cas pour moi lorsque j'inspectais un fichier provenant d'une grande base de code avec beaucoup de dépendances. Les éléments suivants traiteront le fichier sous forme de texte et rechercheront tous les noms de méthode commençant par «def» et les imprimeront ainsi que leurs numéros de ligne.
la source
ast
module. Voir ma réponse pour un exemple.Hormis dir (module) ou help (module) mentionnés dans les réponses précédentes, vous pouvez également essayer:
- Ouvrez ipython
- importez module_name
- tapez module_name, appuyez sur tab. Cela ouvrira une petite fenêtre avec la liste de toutes les fonctions du module python.
Ça a l'air très soigné.
Voici un extrait répertoriant toutes les fonctions du module hashlib
la source
Cela ajoutera toutes les fonctions définies dans votre_module dans une liste.
la source
unit8_conversion_methods
? Est-ce juste un exemple du nom du module?[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
Vous pouvez utiliser la méthode suivante pour obtenir la liste de toutes les fonctions de votre module à partir du shell:
import module
la source
la source
Production :
la source