2008-09-26 27 views
250

Tengo un módulo de Python instalado en mi sistema y me gustaría poder ver qué funciones/clases/métodos hay disponibles en él.¿Cómo enumerar todas las funciones en un módulo de Python?

Quiero llamar a la función de documento en cada uno. En ruby ​​puedo hacer algo como ClassName.methods para obtener una lista de todos los métodos disponibles en esa clase. ¿Hay algo similar en Python?

por ejemplo. algo así como:

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

considere la posibilidad de revisar la respuesta seleccionada! hay soluciones mejores/más fáciles de usar que se sugieren en otras respuestas. – r2d2oid

Respuesta

90

El módulo de inspección. También vea el módulo pydoc, la función help() en el intérprete interactivo y la herramienta de línea de comandos pydoc que genera la documentación que está buscando. Puedes darles la clase de la que deseas ver la documentación. También pueden generar, por ejemplo, salida HTML y escribirla en el disco.

+1

He hecho el caso para usar el módulo 'ast' en ciertas situaciones en [mi respuesta] (http://stackoverflow.com/a/31005891/21028). – csl

+20

No entiendo por qué se seleccionó esta opción como la respuesta, mientras que claramente hay una mejor ... – frankliuao

331

Puede utilizar dir(module) para ver todos los métodos disponibles/atributos. También echa un vistazo a PyDocs.

+10

Esto no es estrictamente cierto. La función 'dir()' "intenta producir la información más relevante, en lugar de completa". Fuente: http://docs.python.org/library/functions.html#dir. – Zearin

+14

@jAckOdE ¿Cotizado? Luego obtendrá los métodos y atributos disponibles del módulo de cadena. – OrangeTux

+0

@OrangeTux: oops, se supone que es una pregunta. sí, lo respondiste. – 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

Para esta ruta, use getattr (su módulo, a, Ninguno) en lugar de su módulo .__ dict __. Obtenga (a) –

+0

solamente muestra funciones, no clases, etc. –

+4

your_module .__ dict__ es mi elección porque en realidad obtienes un dict que contiene functionName: y ahora tienes la capacidad de LLAMAR esa función dinámicamente. ¡Buenos tiempos! – jsh

108

Una vez que haya import ed el módulo, sólo se puede hacer:

help(modulename) 

... Para obtener la documentación de todas las funciones a la vez, de forma interactiva. O puede utilizar:

dir(modulename) 

... Para listar simplemente los nombres de todas las funciones y variables definidas en el módulo.

25

esto va a hacer el truco:

dir(module) 

Sin embargo, si le resulta molesto para leer la lista devuelta, sólo tiene que utilizar el siguiente bucle para obtener un nombre por línea.

for i in dir(module): print i 
53

Un ejemplo con Comprobar:

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 devuelve una lista de (OBJECT_NAME, tipo_objeto) tuplas.

Puede reemplazar la función con cualquiera de las otras funciones de isXXX en el módulo de inspección.

+17

'getmembers' puede tomar un predicado, por lo que su ejemplo también podría escribirse: ' lista_funciones = [o para o en getmembers (my_module, isfunction)] ' –

+13

@ChristopherCurrie, también puedes evitar la comprensión inútil de la lista con' functions_list = getmembers (my_module, predicate) 'porque ya devuelve una lista;) – Nil

+0

Para encontrar si la función está definida en ese módulo (en lugar de importarse) add: to "if isfunction (o [1]) ** and o [1] .__ module__ == my_module .__ name __ **" - note que no funcionará necesariamente si la función importada on proviene de un módulo con el mismo nombre que este módulo. –

17

dir(module) es la forma estándar cuando se utiliza un script o el intérprete estándar, como se menciona en la mayoría de las respuestas.

Sin embargo, con un shell de python interactivo como IPython puede usar tab-completion para obtener una visión general de todos los objetos definidos en el módulo. Esto es mucho más conveniente que usar un script y print para ver qué se define en el módulo.

  • module.<tab> le mostrará todos los objetos definidos en el módulo (funciones, clases y así sucesivamente)
  • module.ClassX.<tab> le mostrará los métodos y atributos de una clase
  • module.function_xy? o module.ClassX.method_xy? le mostrará la cadena de documentación de esa función/método
  • module.function_x?? o module.SomeClass.method_xy?? le mostrará el código fuente de la función/método.
-5

No es (o al menos ya no es) adecuado usar dir (módulo). El código debe leer como esto:

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

O especificar el módulo que desea de esta manera: dir('sys') para producir resultados de las sys nombre del módulo. dir() devuelve errores, mientras que dir('') es lo que necesita. * help ('') devolverá información de ayuda si está disponible para la mayoría de las funciones. p.ej; help('modules') devolverá la información de ayuda del módulo.

Gracias por todos los votos a favor. Estaba usando Python3.2.2 y otras versiones 3x cuando publiqué esto. El punto era usar ('cosas') en lugar de las anteriores (cosas). Pero supongo que todos ustedes están atrapados en Python2 o usan versiones más nuevas para PC que no son móviles como yo.

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

+0

o especifique el módulo que desea de esta manera: dir ('sys') para producir resultados del nombre del módulo sys. dir() devuelve errores mientras que dir ('') es lo que necesita. * help ('') devolverá información de ayuda si está disponible para la mayoría de las funciones.p.ej; help ('modules') devolverá la información de ayuda del módulo. –

+5

dir ('module') devuelve los métodos para la función de cadena, que es totalmente diferente de lo que esperaba. Creo que esto es lo mismo incluso para python 3. –

1

Ninguna de estas respuestas funcionará si no puede importar dicho archivo Python y sin errores de importación. Este fue el caso para mí cuando estaba inspeccionando un archivo que proviene de una gran base de código con muchas dependencias. A continuación, procesaremos el archivo como texto y buscaremos todos los nombres de métodos que comiencen con "def" e imprimirlos y sus números de línea.

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

En este caso, es mucho mejor usar el módulo 'ast'. Ver [mi respuesta] (http://stackoverflow.com/a/31005891/21028) para un ejemplo. – csl

+0

Creo que este es un método válido. ¿Por qué un downvote cuando lo hace? – erm3nda

21

Para completarlo, me gustaría señalar que a veces es posible que desee código de análisis lugar de importarlo. Un import va a ejecutar expresiones de nivel superior, y eso podría ser un problema.

Por ejemplo, estoy dejando que los usuarios seleccionen funciones de punto de entrada para paquetes hechos con zipapp. El uso de import y inspect arriesga la ejecución de un código erróneo, lo que provoca bloqueos, mensajes de ayuda impresos, ventanas emergentes de GUI, etc.

En lugar de eso usar el módulo ast para enumerar todas las funciones de nivel superior:

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) 

Poner este código en list.py y utilizando como entrada, me sale:

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

Por supuesto, Navegar por un AST puede ser complicado algunas veces, incluso para un lenguaje relativamente simple como Python, porque el AST es bastante bajo. Pero si tiene un caso de uso simple y claro, es posible y seguro.

Sin embargo, un inconveniente es que no puede detectar las funciones que se generan en el tiempo de ejecución, como foo = lambda x,y: x*y.

+1

Me gusta esto; Actualmente estoy tratando de averiguar si alguien ya ha escrito una herramienta que hace algo como pydoc pero sin importar el módulo. Hasta ahora, este es el mejor ejemplo que he encontrado de esto :) –

+1

¡Esta es definitivamente la manera correcta de hacer esto, mucho más segura! ¡Gracias! – David

-5

Usted puede utilizar el siguiente método para obtener la lista de todas las funciones en el módulo de Shell:

import module

module.*? 
0

Excepto dir (módulo) o ayuda (módulo) se menciona en las respuestas anteriores, se también puede intentar:
- Abrir ipython
- import module_name
- escriba module_name, presione tab. Abrirá una pequeña ventana con una lista de todas las funciones en el módulo de Python.
Se ve muy limpio.

Aquí se fragmento listando todas las funciones del módulo de 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

Para código que no desea analizar, recomiendo el enfoque basado en el AST de @csl anteriormente.

Para todo lo demás, el módulo de inspección es correcta:

import inspect 

import <module_to_inspect> as module 

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

Esto da una lista de 2-tuplas en forma [(<name:str>, <value:function>), ...].

La respuesta simple anterior se insinúa en varias respuestas y comentarios, pero no se menciona explícitamente.

Cuestiones relacionadas