2009-07-09 7 views
20

Ok Ich weiß, dass Sie die dir() -Methode verwenden können, um alles in einem Modul aufzulisten. Aber gibt es eine Möglichkeit, nur die Funktionen zu sehen, die in diesem Modul definiert sind? Zum Beispiel sei angenommen mein Modul sieht wie folgt aus:Suchen Sie Funktionen, die explizit in einem Modul definiert sind (Python)

from datetime import date, datetime 

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

Auch wenn ich die builtins verwenden zu inspizieren(), um herauszufiltern, bin ich immer noch mit etwas übrig geblieben, die importiert wurde. Ich werde beispiel sehen:

[ 'Datum', 'Datetime', 'test']

Gibt es eine Möglichkeit der Einfuhr auszuschließen? Oder eine andere Möglichkeit herauszufinden, was in einem Modul definiert ist?

+1

Was ist los mit dem Lesen der Quelle? –

+0

In Python wird "Methode" im Allgemeinen nur für Funktionen verwendet, die Attribute einer Klasse sind. Ihr 'test()' wird besser als "Funktion" bezeichnet. – Miles

Antwort

25

Suchen Sie etwas wie das?

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: Changed Variablennamen von 'Meth' bis 'Func' um Verwirrung zu vermeiden (wir mit Funktionen zu tun, diese Methoden nicht, hier).

+0

Leider funktioniert dies nicht für dekorierte Funktionen. –

+0

@ars Könnten Sie nicht einfach Ihre Funktionen durch '[f [1] für f in inspect.getmembers (mod) ersetzen, wenn inspect.isfunction (f [1])]' 'und die gleichen Ergebnisse erhalten? – mVChr

+0

Gerede, das würde importierte Funktionen beinhalten, brauchen immer noch das 'getmodule (func) == mod', damit es funktioniert, aber immer noch ein einseitiges Liner. – mVChr

1

Jede Klasse in Python hat ein __module__ Attribut. Sie können den Wert zum Filtern verwenden. Werfen Sie einen Blick auf example 6.14 in dive into python

+0

aber dies ist keine Klasse, es sind nur einige Methoden in einem Modul definiert ... – Cory

+0

Funktionen haben auch das '__module__' Attribut. – Miles

0

das Python inspect Modul ist wahrscheinlich, was Sie hier suchen.

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

Ich habe dies versucht - inspect immer noch importiert Methoden – Cory

+0

Sieht aus wie es in Kombination mit Stefano Antwort funktionieren würde. Sie können sehen, was eine Methode ist und was importiert wird. –

+1

Ich kommentieren diesen Beitrag, weil mein rep unter 50 ist. Funktionen haben __module__ Attribut auch. –

4

Wie über die folgenden:

grep ^def my_module.py 
+0

haha, es muss einen besseren Weg geben, oder? – Cory

+0

Es ist eine schnelle und schmutzige Lösung, die funktioniert. Es ist vielleicht nicht die beste Lösung für Ihr Problem, aber ich würde es nicht wissen, weil ich nicht weiß, welches Problem Sie lösen möchten. –

+0

+1: Nur die Quelle lesen. –

2

Sie können prüfen, __module__ Attribut der Funktion in Frage. Ich sage "Funktion", weil eine Methode normalerweise zu einer Klasse gehört ;-).

BTW, eine Klasse hat eigentlich auch __module__ Attribut.