Tengo un módulo de Python instalado en mi sistema y me gustaría poder ver qué funciones / clases / métodos están disponibles en él.
Quiero llamar a la función doc 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?
p.ej. algo como:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
python
reflection
module
inspect
Chris Gow
fuente
fuente
Respuestas:
El
inspect
modulo. Consulte también elpydoc
módulo, lahelp()
función en el intérprete interactivo y lapydoc
herramienta de línea de comandos que genera la documentación que busca. Puede darles la clase de la que desea ver la documentación. También pueden generar, por ejemplo, salida HTML y escribirla en el disco.fuente
ast
módulo en ciertas situaciones en mi respuesta .dir
para devolver funciones y variables; usarinspect
para filtrar funciones solamente; y usarast
para analizar sin importar.Puede usar
dir(module)
para ver todos los métodos / atributos disponibles. También echa un vistazo a PyDocs.fuente
dir()
función "intenta producir la información más relevante, en lugar de completa". Fuente: docs.python.org/library/functions.html#dir .inspect
.Una vez que haya
import
editado el módulo, puede hacer lo siguiente:... Para obtener los documentos sobre todas las funciones a la vez, de forma interactiva. O puedes usar:
... Simplemente enumerar los nombres de todas las funciones y variables definidas en el módulo.
fuente
inspect
módulo también puede enumerar variables, aunque no se solicite explícitamente aquí. Esta solución solo requiere objetos integrados, lo que puede ser muy útil en algunos casos donde Python se instala en un entorno restringido / bloqueado / roto.dir
imprimiría los resultados, sin embargo, parece que debe hacerloprint(dir(modulename))
.Un ejemplo con inspeccionar:
getmembers devuelve una lista de tuplas (object_name, object_type).
Puede reemplazar isfunction con cualquiera de las otras funciones isXXX en el módulo de inspección.
fuente
getmembers
puede tomar un predicado, por lo que su ejemplo también podría escribirse:functions_list = [o for o in getmembers(my_module, isfunction)]
functions_list = getmembers(my_module, predicate)
porque ya devuelve una lista;)fuente
En aras de la integridad, me gustaría señalar que a veces es posible que desee analizar el código en lugar de importarlo. Una
import
se ejecutan expresiones de alto nivel, y que podría ser un problema.Por ejemplo, dejo que los usuarios seleccionen funciones de punto de entrada para paquetes que se hacen con zipapp . El uso
import
y elinspect
riesgo de ejecutar el código de mal camino, lo que provoca bloqueos, mensajes de ayuda que se imprimen, cuadros de diálogo de GUI emergentes, etc.En cambio, uso el módulo ast para enumerar todas las funciones de nivel superior:
Al poner este código
list.py
y usarlo como entrada, obtengo:Por supuesto, navegar un AST puede ser complicado a veces, incluso para un lenguaje relativamente simple como Python, porque el AST es de nivel bastante bajo. Pero si tiene un caso de uso simple y claro, es factible y seguro.
Sin embargo, una desventaja es que no puede detectar funciones que se generan en tiempo de ejecución, como
foo = lambda x,y: x*y
.fuente
__version__
etc.)? ¿Hay alguna manera de conseguir eso?Para el código que no desea analizar, le recomiendo el enfoque basado en AST de @csl anterior.
Para todo lo demás, el módulo de inspección es correcto:
Esto proporciona una lista de 2 tuplas en el formulario
[(<name:str>, <value:function>), ...]
.La respuesta simple anterior se insinúa en varias respuestas y comentarios, pero no se menciona explícitamente.
fuente
Esto hará el truco:
Sin embargo, si le resulta molesto leer la lista devuelta, simplemente use el siguiente bucle para obtener un nombre por línea.
fuente
inspect
. Además, ¿cómo es esto diferente de la respuesta de @ DanLenski?dir(module)
es la forma estándar cuando se usa 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 la finalización de tabulación 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
ver qué se define en el módulo.module.<tab>
le mostrará todos los objetos definidos en el módulo (funciones, clases, etc.)module.ClassX.<tab>
le mostrará los métodos y atributos de una clasemodule.function_xy?
omodule.ClassX.method_xy?
le mostrará la cadena de documentación de esa función / métodomodule.function_x??
omodule.SomeClass.method_xy??
le mostrará el código fuente de la función / método.fuente
Para las funciones globales
dir()
es el comando a usar (como se menciona en la mayoría de estas respuestas), sin embargo, esto enumera las funciones públicas y las funciones no públicas juntas.Por ejemplo ejecutando:
Devuelve funciones / clases como:
Algunos de los cuales generalmente no están destinados para el uso de programación general (sino por el módulo en sí, excepto en el caso de DunderAliases como
__doc__
,__file__
ect). Por esta razón, puede no ser útil enumerarlos con los públicos (así es como Python sabe qué obtener cuando se usafrom module import *
).__all__
podría usarse para resolver este problema, devuelve una lista de todas las funciones públicas y clases en un módulo (las que no comienzan con guiones bajos_
). Ver ¿Puede alguien explicar __todos__ en Python? para el uso de__all__
.Aquí hay un ejemplo:
Se han eliminado todas las funciones y clases con guiones bajos, dejando solo aquellas que se definen como públicas y, por lo tanto, se pueden usar a través de
import *
.Tenga en cuenta que
__all__
no siempre se define. Si no está incluido,AttributeError
se levanta un.Un caso de esto es con el módulo ast:
fuente
Ninguna de estas respuestas funcionará si no puede importar dicho archivo Python 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. Lo siguiente procesará el archivo como texto y buscará todos los nombres de métodos que comiencen con "def" y los imprimirán junto con sus números de línea.
fuente
ast
módulo. Vea mi respuesta para un ejemplo.Excepto dir (módulo) o ayuda (módulo) mencionado en respuestas anteriores, también puede intentar:
- Abrir ipython
- importar nombre_módulo
- escribir nombre_módulo, presionar tabulador. Se abrirá una pequeña ventana con una lista de todas las funciones en el módulo de Python.
Se ve muy bien.
Aquí hay un fragmento que enumera todas las funciones del módulo hashlib
fuente
Esto agregará todas las funciones que están definidas en your_module en una lista.
fuente
unit8_conversion_methods
? ¿Es esto solo un ejemplo del nombre del módulo?[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
Puede usar el siguiente método para obtener una lista de todas las funciones en su módulo desde el shell:
import module
fuente
fuente
Salida:
fuente