0

次の機能を作りたい:

 1)input is a number. 
 2)functions are indexed, return a function whose index matches given number

これが私が思いついたものです:

def foo_selector(whatfoo):
    def foo1():
        return
    def foo2():
        return
    def foo3():
        return
    ...

    def foo999():
        return

    #something like return foo[whatfoo]

問題は、関数(foo#)にインデックスを付けるにはどうすればよいですか?dir()で関数foo1からfoo999を見ることができます。ただし、dir()は、関数自体ではなく、そのような関数の名前を返します。この例では、これらのfoo関数は何もしていません。ただし、私のプログラムでは、それらは異なるタスクを実行し、それらを自動的に生成することはできません。私はそれらを自分で書き、それらの名前でそれらを返さなければなりません。

4

3 に答える 3

4

関数のリストを蓄積するには、デコレータを使用します。

func_list = []

def listed_func(func):
    func_list.append(func)
    return func

@listed_func
def foo1():
   pass

@listed_func
def foo2():
   pass

これで、リスト内のインデックスによって関数に簡単にアクセスできます。

関数に名前でアクセスしたい場合は、辞書を作成することもできます。

func_dict = {}

def collected_func(func):
    func_dict[func.__name__] = func
    return func

または、名前からインデックスを抽出し、それを dict キーとして使用します (dict は順序付けされていないため、キーを何らかの順序で反復処理する場合は、キーを並べ替える必要があります)。

func_dict = {}

def collected_func(func):
    key = int("".join(c for c in func.__name__ if c.isdigit()))
    func_dict[key] = func
    return func

または明示的にインデックス番号をデコレータに渡します:

func_dict = {}

def collected_func(key):
    def decorator(func):
        func_dict[key] = func
        return func
    return decorator

@collected_func(12)
def foo():
    pass
于 2012-12-02T05:01:10.123 に答える
0

これがあなたがそれをすることができる他のいくつかの方法です:

eval("foo{}()".format(whatfoo))

また

locals()['foo{}'.format(whatfoo)]

于 2012-12-02T04:33:28.917 に答える
0

次のように、すべての関数を配列に配置するだけです。

def foo_selector(whatfoo):
    def foo1():
        return
    def foo2():
        return
    def foo3():
        return
    ...

    def foo999():
        return

    foo_list = [
        foo1,
        foo2,
        ...
        foo999
    ]

    return foo_list[whatfoo]
于 2012-12-02T03:40:58.210 に答える