Un module python est 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 dans cette classe. Y at-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
Le module inspecter. Voir également le module pydoc
, la fonction help()
dans l'interpréteur interactif et l'outil de ligne de commande pydoc
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.
Vous pouvez utiliser dir(module)
pour voir toutes les méthodes/attributs disponibles. Consultez également PyDocs.
Une fois que vous avez import
ed le module, vous pouvez simplement faire:
help(modulename)
... Pour obtenir la documentation sur toutes les fonctions à la fois, de manière interactive. Ou vous pouvez utiliser:
dir(modulename)
... Pour lister simplement les noms de toutes les fonctions et variables définies dans le module.
Un exemple avec inspect:
from inspect import getmembers, isfunction
from my_project import my_module
functions_list = [o for o in getmembers(my_module) if isfunction(o[1])]
getmembers retourne une liste de tuples (nom_objet, type_objet).
Vous pouvez remplacer sa fonction par l'une des autres fonctions isXXX du module d'inspection.
import types
import yourmodule
print([getattr(yourmodule, a) for a in dir(yourmodule)
if isinstance(getattr(yourmodule, a), types.FunctionType)])
Par souci d'exhaustivité, j'aimerais souligner que vous pouvez parfois vouloir analyser le code au lieu de l'importer. Un import
va exécuter des expressions de niveau supérieur, ce qui pourrait poser problème.
Par exemple, je laisse les utilisateurs sélectionner les fonctions de point d’entrée pour les packages réalisés avec zipapp . Utiliser import
et inspect
risque d'exécuter du code égaré, d'entraîner des plantages, des messages d'aide en cours d'impression, des dialogues d'interface graphique surgissant, etc.
À la place, j'utilise le module ast pour répertorier toutes les fonctions de niveau supérieur:
import ast
import sys
def top_level_functions(body):
return (f for f in body if isinstance(f, ast.FunctionDef))
def parse_ast(filename):
with open(filename, "rt") as file:
return ast.parse(file.read(), filename=filename)
if __== "__main__":
for filename in sys.argv[1:]:
print(filename)
tree = parse_ast(filename)
for func in top_level_functions(tree.body):
print(" %s" % func.name)
En mettant ce code dans list.py
et en utilisant lui-même comme entrée, je reçois:
$ python list.py list.py
list.py
top_level_functions
parse_ast
Bien sûr, la navigation dans AST peut parfois être délicate, même pour un langage relativement simple comme Python, car le AST est assez bas niveau. Mais si vous avez un cas d'utilisation simple et clair, c'est à la fois faisable et sûr.
Cependant, l'inconvénient est que vous ne pouvez pas détecter les fonctions générées au moment de l'exécution, telles que foo = lambda x,y: x*y
.
Ça fera l'affaire:
dir(module)
Cependant, si vous trouvez agaçant de lire la liste renvoyée, utilisez simplement la boucle suivante pour obtenir un nom par ligne.
for i in dir(module): print i
dir(module)
est la méthode standard pour utiliser un script ou un interpréteur standard, comme indiqué dans la plupart des réponses.
Cependant, avec un shell python interactif tel que IPython , vous pouvez utiliser la complétion par 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
pour 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>
va vous montrer les méthodes et les attributs d'une classemodule.function_xy?
ou module.ClassX.method_xy?
vous montrera la docstring de cette fonction/méthodemodule.function_x??
ou module.SomeClass.method_xy??
vous montrera le code source de la fonction/méthode. 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 inspecter est correct:
import inspect
import <module_to_inspect> as module
functions = inspect.getmembers(module, inspect.isfunction)
Ceci donne une liste de 2 tuples sous la forme [(<name:str>, <value:function>), ...]
.
La réponse simple ci-dessus est évoquée dans diverses réponses et commentaires, mais n'est pas explicitement appelée.
Pour les fonctions globales, dir()
est la commande à utiliser (comme indiqué dans la plupart des réponses), toutefois, elle répertorie les fonctions publiques et les fonctions non publiques.
Par exemple en cours d'exécution:
>>> import re
>>> dir(re)
Renvoie les fonctions/classes comme:
'__all__', '_MAXCACHE', '_alphanum_bytes', '_alphanum_str', '_pattern_type', '_pickle', '_subx'
Certaines d'entre elles ne sont généralement pas destinées à 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 lister avec les noms publics (c’est ainsi que Python sait quoi obtenir en utilisant from module import *
).
__all__
pourrait être utilisé pour résoudre ce problème, il retourne une liste de toutes les fonctions et classes publiques d’un module (celles qui ne font pas commencent par des underscores - _
). Voir Quelqu'un peut-il expliquer __all__ en Python? pour l'utilisation de __all__
.
Voici un exemple:
>>> import re
>>> re.__all__
['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']
>>>
Toutes les fonctions et classes avec des traits de soulignement ont été supprimées, ne laissant que celles définies comme publiques et pouvant donc être utilisées via import *
.
Notez que __all__
n'est pas toujours défini. S'il n'est pas inclus, alors une AttributeError
est générée.
Un cas de cela est avec le module ast:
>>> import ast
>>> ast.__all__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'ast' has no attribute '__all__'
>>>
Aucune de ces réponses ne fonctionnera si vous ne parvenez pas à importer ledit fichier Python sans erreur d'importation. Ce fut le cas pour moi lors de l'inspection d'un fichier provenant d'une base de code volumineuse comportant de nombreuses dépendances. Ce qui suit traitera le fichier en tant que texte et recherchera tous les noms de méthodes commençant par "def" et les imprimera avec leur numéro de ligne.
import re
pattern = re.compile("def (.*)\(")
for i, line in enumerate(open('Example.py')):
for match in re.finditer(pattern, line):
print '%s: %s' % (i+1, match.groups()[0])
Sauf dir (module) ou help (module) mentionné dans les réponses précédentes, vous pouvez également essayer:
- Ouvrez ipython
- import module_name
- tapez nom_module, appuyez sur la touche de tabulation. Cela ouvrira une petite fenêtre avec la liste de toutes les fonctions du module python.
Ça a l'air très chouette.
Voici un extrait listant toutes les fonctions du module hashlib
(C:\Program Files\Anaconda2) C:\Users\lenovo>ipython
Python 2.7.12 |Anaconda 4.2.0 (64-bit)| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.
IPython 5.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import hashlib
In [2]: hashlib.
hashlib.algorithms hashlib.new hashlib.sha256
hashlib.algorithms_available hashlib.pbkdf2_hmac hashlib.sha384
hashlib.algorithms_guaranteed hashlib.sha1 hashlib.sha512
hashlib.md5 hashlib.sha224
Vous pouvez utiliser la méthode suivante pour obtenir la liste de toutes les fonctions de votre module à partir de Shell:
import module
module.*?
Cela va ajouter toutes les fonctions définies dans votre_module dans une liste.
result=[]
for i in dir(unit8_conversion_methods):
if type(getattr(your_module, i)).__== "function":
result.append(getattr(your_module, i))