39

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

foo.py

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

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

main.py

from foo import * 
# or
import foo

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


助けてくれてありがとう、私は欲しいもののためのクラスを作りました。提案があればコメントしてください

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] 
4

6 に答える 6

79

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

 import inspect

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

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

于 2010-10-28T07:30:51.007 に答える
10

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 でのイントロスペクションに関する次の概要が役立つ場合があります。

于 2010-10-28T07:17:06.727 に答える
4

たとえば、モジュールの場合、次のような検査モジュールを使用してみてください --> temp.py

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']
于 2010-10-28T07:38:23.743 に答える
2

現在のモジュール (つまり、インポートされたものではない) の関数をリストしたい場合は、次のようにすることもできます:

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

if __name__ == '__main__':
    print dir(sys.modules[__name__])
于 2013-10-02T14:49:17.683 に答える
2

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

from foo import * 
print dir()

パラメータなしで使用dir()して、現在のモジュールの名前空間にあるオブジェクトを表示できます。これには、おそらくfoo.

絶対インポートの場合(ちなみにこれを好むはずです)、モジュールを次の場所に渡すことができますdir()

import foo
print dir(foo)

のドキュメントdirも確認してください。関数だけが欲しかったので、 の使用を検討することをお勧めしますinspect.isfunction。そのリストをデバッグ以外の目的で使用しないでください。

于 2010-10-28T07:19:39.903 に答える