web-dev-qa-db-ja.com

モジュール内のすべての関数をリストすることは可能ですか?

この形式で.pyファイルを定義しました。

foo.py

def foo1(): pass
def foo2(): pass
def foo3(): pass

別のファイルからインポートします:

main.py

from foo import * 
# or
import foo

すべての関数名をリストすることは可能ですか? ["foo1", "foo2", "foo3"]


あなたの助けをありがとう、私は私が欲しいもののためのクラスを作りました、あなたが提案を持っている場合plsコメント

class GetFuncViaStr(object):
    def __init__(self):
        d = {}
        import foo
        for y in [getattr(foo, x) for x in dir(foo)]:
            if callable(y):
               d[y.__name__] = y
    def __getattr__(self, val) :
        if not val in self.d :
           raise NotImplementedError
        else:
           return d[val] 
33
user478514

これらのことを行う最もクリーンな方法は、検査モジュールを使用することです。 2番目の引数として述語を取るgetmembers関数があります。 isfunctionを述部として使用できます。

 import inspect

 all_functions = inspect.getmembers(module, inspect.isfunction)

今、all_functionsは、最初の要素が関数の名前であり、2番目の要素が関数自体であるタプルのリストになります。

72
aaronasterling

dirを使用して名前空間を探索できます。

import foo
print dir(foo)

例:シェルにfooをロードする

>>> import foo
>>> dir(foo)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo1', 'foo2', 'foo3']
>>> 
>>> getattr(foo, 'foo1')
<function foo1 at 0x100430410>
>>> k = getattr(foo, 'foo1')
>>> k.__name__
'foo1'
>>> callable(k)
True
>>> 

Getattrを使用して、fooの関連属性を取得し、呼び出し可能かどうかを確認できます。

ドキュメントを確認してください: http://docs.python.org/tutorial/modules.html#the-dir-function

また、「from foo import *」を実行すると、名前はこれを呼び出すネームスペースに含まれます。

>>> from foo import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'atexit', 'foo1', 'foo2', 'foo3']
>>> 

pythonのイントロスペクションに関する次の簡単な説明が役立つ場合があります。

9
pyfunc

モジュール-> temp.pyの場合、exmapleには以下のような検査モジュールを使用してみてください

In [26]: import inspect

In [27]: import temp

In [28]: l1 = [x.__name__ for x in temp.__dict__.values() if inspect.isfunction(x)]

In [29]: print l1
['foo', 'coo']
4
shahjapan

aaronasterling said と同様に、inspectモジュールの getmembers 関数を使用してこれを行うことができます。

import inspect

name_func_tuples = inspect.getmembers(module, inspect.isfunction)
functions = dict(name_func_tuples)

ただし、これには、他の場所で定義された関数が含まれますが、そのモジュールの名前空間にインポートされます。

そのモジュールで定義されている関数のみを取得する場合は、次のスニペットを使用します。

name_func_tuples = inspect.getmembers(module, inspect.isfunction)
name_func_tuples = [t for t in name_func_tuples if inspect.getmodule(t[1]) == module]
functions = dict(name_func_tuples)
4
Flimm

現在のモジュール(インポートされたモジュールではない)の関数を一覧表示する場合は、次のようなこともできます。

import sys
def func1(): pass
def func2(): pass

if __name__ == '__main__':
    print dir(sys.modules[__name__])
2
verboze

ワイルドインポートの場合

_from foo import * 
print dir()
_

パラメータなしでdir()を使用して、現在のモジュールの名前空間内のオブジェクトを表示できます。ほとんどの場合、これにはfooのコンテンツ以外のものも含まれます。

絶対インポートの場合(ちなみに、この方法をお勧めします)、モジュールをdir()に渡すことができます。

_import foo
print dir(foo)
_

dirのドキュメント も確認してください。関数だけが欲しかったので、 _inspect.isfunction_ の使用を検討したいかもしれません。そのリストをデバッグ以外の目的に使用しないでください。

1
AndiDog