2009-07-09 19 views
20

Ok Sé que puede usar el método dir() para listar todo en un módulo, pero ¿hay alguna forma de ver solo las funciones que están definidas en ese módulo? Por ejemplo, supongamos que mi módulo es el siguiente:Buscar funciones definidas explícitamente en un módulo (python)

from datetime import date, datetime 

def test(): 
    return "This is a real method" 

Incluso si uso inspeccionar() para filtrar las órdenes internas, todavía me quedo con todo lo que se importó. Voy a ver por ejemplo:

[ 'fecha', 'fecha y hora', 'prueba']

¿Hay alguna manera de excluir las importaciones? ¿O otra forma de averiguar qué se define en un módulo?

+1

¿Qué pasa con la lectura de la fuente? –

+0

En Python, el "método" generalmente solo se usa para referirse a funciones que son atributos de una clase. Su 'test()' se conoce mejor como una "función". – Miles

Respuesta

25

¿Estás buscando algo como esto?

import sys, inspect 

def is_mod_function(mod, func): 
    return inspect.isfunction(func) and inspect.getmodule(func) == mod 

def list_functions(mod): 
    return [func.__name__ for func in mod.__dict__.itervalues() 
      if is_mod_function(mod, func)] 


print 'functions in current module:\n', list_functions(sys.modules[__name__]) 
print 'functions in inspect module:\n', list_functions(inspect) 

EDIT: Se ha cambiado los nombres de variables de 'meth' a 'func' para evitar confusiones (que estamos tratando con funciones, no métodos, aquí).

+0

Desafortunadamente, esto no funcionará para las funciones decoradas. –

+0

@ars ¿No podría simplemente reemplazar sus funciones con '[f [1] for f in inspect.getmembers (mod) if inspection.isfunction (f [1])]' y obtener los mismos resultados? – mVChr

+0

No importa, eso incluiría funciones importadas, aún necesita el 'getmodule (func) == mod' para que funcione, pero aún así es un liner único. – mVChr

1

Cada clase en python tiene un atributo __module__. Puede usar su valor para realizar el filtrado. Eche un vistazo a example 6.14 in dive into python

+0

pero esta no es una clase, solo se trata de algunos métodos definidos en un módulo ... – Cory

+0

Las funciones también tienen el atributo '__module__'. – Miles

0

el módulo python inspect es probablemente lo que está buscando aquí.

import inspect 
if inspect.ismethod(methodInQuestion): 
    pass # It's a method 
+1

Intenté esto - inspeccionar aún devuelve métodos importados – Cory

+0

Parece que funcionaría en combinación con la respuesta de Stefano. Puedes ver qué es un método y qué se importa. –

+1

Comentando esta publicación porque mi representante es menor de 50. Las funciones también tienen el atributo __module__. –

4

¿Qué hay de lo siguiente:

grep ^def my_module.py 
+0

jaja, tiene que haber una manera mejor, ¿verdad? – Cory

+0

Es una solución rápida y sucia que funciona. Puede que no sea la mejor solución para su problema, pero no lo sé porque no sé qué problema está tratando de resolver. –

+0

+1: acaba de leer la fuente. –

2

Puede comprobar __module__ atributo de la función en cuestión. Digo "función" porque un método pertenece a una clase por lo general ;-).

BTW, una clase en realidad también tiene el atributo __module__.

Cuestiones relacionadas