この形式で.pyファイルを定義しました。
def foo1(): pass
def foo2(): pass
def foo3(): pass
別のファイルからインポートします:
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]
これらのことを行う最もクリーンな方法は、検査モジュールを使用することです。 2番目の引数として述語を取るgetmembers
関数があります。 isfunction
を述部として使用できます。
import inspect
all_functions = inspect.getmembers(module, inspect.isfunction)
今、all_functions
は、最初の要素が関数の名前であり、2番目の要素が関数自体であるタプルのリストになります。
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のイントロスペクションに関する次の簡単な説明が役立つ場合があります。
モジュール-> 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']
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)
現在のモジュール(インポートされたモジュールではない)の関数を一覧表示する場合は、次のようなこともできます。
import sys
def func1(): pass
def func2(): pass
if __name__ == '__main__':
print dir(sys.modules[__name__])
ワイルドインポートの場合
_from foo import *
print dir()
_
パラメータなしでdir()
を使用して、現在のモジュールの名前空間内のオブジェクトを表示できます。ほとんどの場合、これにはfoo
のコンテンツ以外のものも含まれます。
絶対インポートの場合(ちなみに、この方法をお勧めします)、モジュールをdir()
に渡すことができます。
_import foo
print dir(foo)
_
dir
のドキュメント も確認してください。関数だけが欲しかったので、 _inspect.isfunction
_ の使用を検討したいかもしれません。そのリストをデバッグ以外の目的に使用しないでください。