2012-12-02 187 views
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函數沒有做任何事情。但是在我的程序中他們執行不同的任務,我不能自動生成它們。我自己寫,並且必須以他們的名字歸還。

+1

你的用例是什麼? –

+0

如果您可以使用'dir()'來查看您的'fooX()'函數名稱,則可以使用'getattr()'來獲取函數本身。 –

回答

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 

或提取從名稱索引,並用其作爲字典鍵(因爲類型的字典是沒有順序的,你會想鍵進行排序,如果你想在它們之間迭代以某種順序):

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 
+0

這取決於'foo2'比'foo1'更靠後。如果這是一個問題,那麼你可以解析函數名來獲取索引。 –

+0

是的,我認爲這些函數的名稱與它們在列表中的順序無關。他們將按照他們定義的順序添加到列表中。 – kindall

+0

爲各種可能性增加了一些替代方案。 – kindall

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] 
+0

當然,這不是很乾。 – delnan

+0

如果沒有更優雅的方式,我認爲這只是我可以採取的選擇 – thkang

0

這裏有一些其他的方法你可以做到這一點:

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

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

+0

您的'eval()'版本可能會非常危險。我會選擇一種不會深入內部的方法。 –