簡體   English   中英

從函數列表返回函數的python函數

[英]python function that returns a function from list of functions

我要執行以下功能:

 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函數沒有執行任何操作。 但是,在我的程序中,它們執行不同的任務,因此我無法自動生成它們。 我自己寫它們,必須按他們的名字歸還它們。

使用裝飾器累積功能列表。

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

您可以將所有函數簡單地放入一個數組中,例如:

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]

您可以通過以下幾種方法來做到這一點:

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

要么

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM