2009-07-09 26 views
20

私はdir()メソッドを使ってモジュール内のすべてをリストすることができますが、そのモジュールで定義されている関数だけを見る方法はありますか?例えば、私のモジュールは次のようになりますと仮定します。私は、組み込みコマンドをフィルタリングするために)(点検使用する場合でもモジュールで明示的に定義された関数を見つける(python)

from datetime import date, datetime 

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

、私はまだ輸入されたものが残っています。例えば私が表示されます:

[「日付」、「日時」、「テスト」]

は輸入品を排除する方法はありますか?あるいは、モジュールで何が定義されているかを調べる別の方法はありますか?

+1

ソースの読み方に問題がありますか? –

+0

Pythonでは、「メソッド」は一般に、クラスの属性である関数を参照するためにのみ使用されます。あなたの 'test()'は、 "関数"と呼ばれています。 – Miles

答えて

25

このようなものをお探しですか?

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:(ここでは、機能ではなく、方法を扱っている)混乱を避けるために「FUNC」から「メタ」から変数名を変更しました。

+0

残念ながら、これは装飾された機能では機能しません。 –

+0

@ars inspect.isfunction(f [1])] 'なら、関数をinspect.getmembers(mod)の' [f [1] 'に置き換えて同じ結果を得ることはできませんか? – mVChr

+0

インポートされた関数を含むNevermindは、まだ動作するには 'getmodule(func)== mod'が必要ですが、それでもなおone-ishライナーです。 – mVChr

1

Pythonの各クラスには、__module__という属性があります。その値を使用してフィルタリングを実行できます。見てくださいexample 6.14 in dive into python

+0

しかし、これはクラスではなく、モジュールで定義されたいくつかのメソッドです... – Cory

+0

関数は '__module__'属性も持っています。 – Miles

0

python inspectモジュールはおそらくあなたが探しているものです。以下について

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

私はこれを試しました - インプットはまだインポートされたメソッドを返します。 – Cory

+0

ステファノの答えと組み合わせて動作するようです。メソッドとインポートされたものがわかります。 –

+1

私の担当者が50歳未満であるため、この投稿にコメントしています。関数にも__module__属性があります。 –

4

方法:

grep ^def my_module.py 
+0

笑、良い方法があるはずですが、そうですか? – Cory

+0

これはすばやく汚れた解決策です。それはあなたの問題のための最良の解決策ではないかもしれませんが、あなたが解決しようとしている問題がわからないので、私は知らないでしょう。 –

+0

+1:ソースを読み込むだけです。 –

2

あなたがチェックすることができ__module__問題の関数の属性。メソッドがクラスに属しているので、私は "function"と言っています;-)。

実際には、クラスも実際に__module__属性を持っています。

関連する問題