2009-07-09 2 views
20

Ok, so che è possibile utilizzare il metodo dir() per elencare tutto in un modulo, ma esiste un modo per vedere solo le funzioni definite in quel modulo? Si supponga ad esempio il mio modulo è simile al seguente:Trova funzioni definite esplicitamente in un modulo (python)

from datetime import date, datetime 

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

Anche se io uso ispezionare() per filtrare i comandi incorporati, sto ancora lasciato con tutto ciò che è stato importato. Per esempio Vedrò:

[ 'data', 'datetime', 'test']

Esiste un modo per escludere le importazioni? O un altro modo per scoprire cosa è definito in un modulo?

+1

Cosa c'è di sbagliato con la lettura della fonte? –

+0

In Python, "metodo" viene generalmente usato solo per riferirsi a funzioni che sono attributi di una classe. Il tuo 'test()' è meglio definito come una "funzione". – Miles

risposta

25

Stai cercando qualcosa di simile?

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: Cambiato nomi delle variabili da 'meth' a 'func' per evitare confusione (abbiamo a che fare con le funzioni, non i metodi, qui).

+0

Sfortunatamente, questo non funzionerà con le funzioni decorate. –

+0

@ars Non potresti semplicemente sostituire le tue funzioni con '[f [1] per f in inspect.getmembers (mod) se inspect.isfunction (f [1])]' e ottieni gli stessi risultati? – mVChr

+0

Nevermind, che includerebbe le funzioni importate, ha ancora bisogno di 'getmodule (func) == mod' perché funzioni, ma rimane sempre un solo liner. – mVChr

1

Ogni classe in python ha un attributo __module__. Puoi usare il suo valore per eseguire il filtraggio. Date un'occhiata a example 6.14 in dive into python

+0

ma questa non è una classe, sono solo alcuni metodi definiti in un modulo ... – Cory

+0

Anche le funzioni hanno l'attributo '__module__'. – Miles

0

il modulo python inspect è probabilmente quello che stai cercando qui.

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

Ho provato questo - controlla ancora restituisce i metodi importati – Cory

+0

Sembra che funzionerebbe in combinazione con la risposta di Stefano. Puoi vedere che cos'è un metodo e cosa viene importato. –

+1

Sto commentando questo post perché la mia ripetizione è inferiore a 50. Le funzioni hanno anche attributo __module__. –

4

Come circa la seguente:

grep ^def my_module.py 
+0

haha, ci deve essere un modo migliore però, giusto? – Cory

+0

È una soluzione rapida e sporca che funziona. Potrebbe non essere la soluzione migliore per il tuo problema, ma non lo saprei perché non so quale problema stai cercando di risolvere. –

+0

+1: leggi la fonte. –

2

È possibile controllare __module__ attributo della funzione in questione. Dico "funzione" perché un metodo appartiene di solito a una classe ;-).

BTW, una classe ha anche l'attributo __module__.