2008-09-26 14 views
250

J'ai un module python installé sur mon système et j'aimerais pouvoir voir quelles fonctions/classes/méthodes sont disponibles.Comment lister toutes les fonctions dans un module Python?

Je souhaite appeler la fonction doc sur chacun d'entre 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 ex. quelque chose comme:

from somemodule import foo 
print foo.methods # or whatever is the correct method to call 
+0

S'il vous plaît envisager d'examiner la réponse sélectionnée! il y a des solutions meilleures/plus faciles à utiliser suggérées dans d'autres réponses. – r2d2oid

Répondre

90

Le module d'inspection. 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.

+1

J'ai fait valoir la nécessité d'utiliser le module 'ast' dans certaines situations dans [ma réponse] (http://stackoverflow.com/a/31005891/21028). – csl

+20

Je ne comprends pas pourquoi cela a été sélectionné comme réponse, alors qu'il y en a clairement un meilleur ... – frankliuao

331

Vous pouvez utiliser dir(module) pour voir toutes les méthodes/attributs disponibles. Consultez également PyDocs.

+10

Ce n'est pas strictement vrai. La fonction 'dir()' tente de produire l'information la plus pertinente plutôt que complète. Source: http://docs.python.org/library/functions.html#dir. – Zearin

+14

@jAckOdE Cité? Ensuite, vous obtiendrez les méthodes et les attributs disponibles du module de chaîne. – OrangeTux

+0

@OrangeTux: oups, cela supposé être une question. Oui, vous avez répondu. – jAckOdE

56
import types 
import yourmodule 

print [yourmodule.__dict__.get(a) for a in dir(yourmodule) 
    if isinstance(yourmodule.__dict__.get(a), types.FunctionType)] 
+7

Pour cette route, utilisez getattr (votremodule, un, None) au lieu de votremodule .__ dict __. Get (a) –

+0

Seulement montre les fonctions, pas les classes, etc. –

+4

your_module .__ dict__ est mon choix parce que vous obtenez réellement un dict contenant functionName: et vous avez maintenant la possibilité d'appeler cette fonction dynamiquement. bon temps! – jsh

108

Une fois que vous avez import ed le module, vous pouvez juste 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.

25

Cela fera l'affaire:

dir(module) 

Toutefois, si vous trouvez qu'il est ennuyeux à lire la liste renvoyée, il suffit d'utiliser la boucle suivante pour obtenir un nom par ligne.

for i in dir(module): print i 
53

Un exemple d'inspecter:

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 renvoie une liste de (nom_objet, object_type) tuples.

Vous pouvez remplacer cette fonction avec l'une des autres fonctions isXXX du module d'inspection.

+17

'getmembers' peut prendre un prédicat, donc votre exemple pourrait aussi être écrit: ' functions_list = [o pour o dans getmembers (mon_module, isfunction)] ' –

+13

@ChristopherCurrie, vous pouvez également éviter la compréhension de liste inutile avec' fonctions_list = getmembers (mon_module, prédicat) 'car il renvoie déjà une liste;) – Nil

+0

Pour savoir si la fonction est définie dans ce module (plutôt que d'être importé) ajouter: à "if isfunction (o [1]) ** et o [1] .__ module__ == mon_module .__ nom __ **" - notez que cela ne fonctionnera pas nécessairement si la fonction importée vient d'un module avec le même nom que ce module. –

17

dir(module) est la manière standard d'utiliser un script ou l'interpréteur standard, comme mentionné dans la plupart des réponses. Cependant, avec un shell python interactif tel que IPython, vous pouvez utiliser tabulation pour obtenir une vue d'ensemble de tous les objets définis dans le module. Ceci est beaucoup plus pratique, que d'utiliser un script et print pour voir ce qui est défini dans le module.

  • module.<tab> vous montrer tous les objets définis dans le module (fonctions, classes et ainsi de suite)
  • module.ClassX.<tab> vous montrera les méthodes et les attributs d'une classe
  • module.function_xy? ou module.ClassX.method_xy? vous montrera les docstring de cette fonction/méthode
  • module.function_x?? ou module.SomeClass.method_xy?? vous montrera le code source de la fonction/méthode.
-5

Il n'est pas (ou du moins plus) approprié d'utiliser dir (module). Le code doit se lire comme suit:

dir('module') or dir('modules') 

Ou vous spécifiez le module que vous voulez comme ceci: dir('sys') pour produire des résultats à partir du nom du module sys. dir() renvoie des erreurs tandis que dir('') est ce dont vous avez besoin. * help ('') retournera des informations d'aide si disponibles pour la plupart des fonctions. par exemple; help('modules') renverra l'info d'aide du module.

Merci pour tous les votes vers le bas. J'utilisais Python3.2.2 et d'autres versions 3x quand j'ai posté ceci. Le but était d'utiliser ('stuff') à la place du précédent (stuff). Mais je suppose que tout est bloqué sur Python2 ou en utilisant des versions plus récentes pour PC non mobile comme je l'étais.

http://effbot.org/librarybook/sys.htm

+0

ou vous spécifiez le module que vous voulez comme ceci: dir ('sys') pour produire des résultats à partir du nom du module sys. dir() renvoie des erreurs alors que dir ('') est ce dont vous avez besoin. * help ('') retournera des informations d'aide si disponibles pour la plupart des fonctions.par exemple; help ('modules') retournera l'info de l'aide du module. –

+5

dir ('module') renvoie les méthodes pour la fonction de chaîne, ce qui est totalement différent de ce que vous attendez. Je crois que c'est même pour python 3. –

1

Aucune de ces réponses ne fonctionnera que si vous ne parvenez pas à importer ledit fichier Python sans erreurs d'importation. Ce fut le cas pour moi quand j'inspectais un fichier qui provient d'une base de code importante avec beaucoup de dépendances. Les éléments suivants traiteront le fichier sous forme de texte et rechercheront tous les noms de méthodes commençant par "def" et les imprimeront ainsi que leurs numéros 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]) 
+1

Dans ce cas, il vaut mieux utiliser le module 'ast'. Voir [ma réponse] (http://stackoverflow.com/a/31005891/21028) pour un exemple. – csl

+0

Je pense que c'est une méthode valide. Pourquoi une downvote quand c'est le cas? – erm3nda

21

Pour être complet bien, je voudrais souligner que, parfois, vous pouvez Parse code au lieu de l'importer. Un import exécutera des expressions de niveau supérieur, ce qui peut poser un problème. Par exemple, je laisse les utilisateurs sélectionner les fonctions de point d'entrée pour les paquets en cours de création avec zipapp. L'utilisation des codes import et inspect risque de générer du code égaré, ce qui entraînerait des plantages, des messages d'aide en cours d'impression, des boîtes de dialogue GUI apparaîtraient, etc.

Au lieu de cela utiliser le module ast pour lister toutes les fonctions de haut niveau:

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 __name__ == "__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) 

Mettre ce code dans list.py et s'utilisant comme entrée, je reçois:

$ python list.py list.py 
list.py 
    top_level_functions 
    parse_ast 

Bien sûr, naviguer dans un AST peut parfois être difficile, même pour un langage relativement simple comme Python, parce que l'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, un inconvénient est que vous ne pouvez pas détecter les fonctions qui sont générées au moment de l'exécution, comme foo = lambda x,y: x*y.

+1

J'aime ça; J'essaie actuellement de savoir si quelqu'un a déjà écrit un outil qui fait quelque chose comme pydoc mais sans importer le module. Jusqu'ici c'est le meilleur exemple que j'ai trouvé de ceci :) –

+1

C'est certainement la bonne manière de faire ceci, beaucoup plus sûre! Merci! – David

-5

Vous pouvez utiliser la méthode suivante pour obtenir la liste de toutes les fonctions de votre module de shell:

import module

module.*? 
0

Sauf dir (module) ou de l'aide (module) mentionné dans les réponses précédentes, vous peut également essayer:
- Ouvrir ipython
- importer nom_module
- type module_name, appuyez sur tab. Cela ouvrira une petite fenêtre avec la liste de toutes les fonctions dans le module python.
Il semble très propre.

Voici la liste Snippet 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 
1

Pour le code que vous ne souhaitez pas analyser, je recommande au-dessus de l'approche basée sur AST-de @csl.

Pour tout le reste, le module Inspect est correct:

import inspect 

import <module_to_inspect> as module 

functions = inspect.getmembers(module, inspect.isfunction) 

Cela donne une liste de 2 triplets sous la forme [(<name:str>, <value:function>), ...].

La réponse simple ci-dessus est suggérée dans diverses réponses et commentaires, mais pas explicitement appelée.

Questions connexes