web-dev-qa-db-ja.com

インデックス(またはキー)が呼び出されたときに、保存された関数を起動するように、関数をリストまたは辞書に保存する方法はありますか?

たとえば、mydict = {'funcList1': [foo(),bar(),goo()], 'funcList2': [foo(),goo(),bar()]のようなものを試しましたが、機能しません。

この種の機能を備えた何らかの構造はありますか?

たくさんのdefステートメントを使用して、これを簡単に行うことができることは明らかです。

def func1():
    foo()
    bar()
    goo()

しかし、私が必要とする声明の数はかなり扱いにくく覚えにくいものになっています。それらを辞書にきちんとラップして、時々キーを調べることができるのはいいことです。

48
Zack

関数はPythonのファーストクラスオブジェクトです。したがって、辞書を使用してディスパッチできます。たとえば、foobarが関数であり、dispatcherはそのような辞書です。

_dispatcher = {'foo': foo, 'bar': bar}
_

値は、関数オブジェクトであるfoobarであり、foo()bar()ではないことに注意してください。

fooを呼び出すには、dispatcher['foo']()を実行します。

編集:リストに保存されているmultiple関数を実行する場合は、このようなことを行うことができます。

_dispatcher = {'foobar': [foo, bar], 'bazcat': [baz, cat]}

def fire_all(func_list):
    for f in func_list:
        f()

fire_all(dispatcher['foobar'])
_
114