2010-10-25 37 views

回答

8

函數是第一類對象。所以像這樣的:

def do_this(): 
    print "In do_this" 

def do_that(): 
    print "In do_that" 

dct = [do_this, do_that] 
dct[0]() 

如果你真的想從一個字符串列表中,您可以使用全局變量()調用它們:

dct = ['do_this', 'do_that'] 
globals()[dct[0]]() 

但我會建議使用全局變量()(或當地人() )可能不是解決您的問題的正確方法。神交蟒蛇方式:具有在一些字典或類或實例的功能>>> import this

+1

現在看來很明顯,謝謝。 我更喜歡你對Frédéric's的回答,因爲'import this'的eval部分 – 2010-10-25 21:49:22

+0

+1, – Zooba 2010-11-02 02:34:14

11

函數是first-class objects在Python:

def do_this(): 
    pass 

def do_that(): 
    pass 

dct = [do_this, do_that] 
dct[0]() # calls do_this() 

如果dct絕對必須是一個字符串列表,我會去與eval()

eval(dct[0] + "()") 

這不是很漂亮,但globals()之間切換和getattr()上正確的模塊可以是一個痛苦。

1


def fn_a(): 
    pass 

some_dict = { 
    'fn_a': fn_a, 
} 

class Someclass(object): 

    @classmethod 
    def fn_a(cls): 
    pass 

    # normal instance method 
    def fn_b(self): 
    pass 

some_instance = Someclass()

你可以這樣做:some_dict['name']()getattr(some_instance, 'fn_b')()getattr(Someclass, 'fn_a')()

2

您可以使用getattr,如果他們在如果它們位於全局命名空間中,則爲模塊或globals()

dct = ['do_this', 'do_that'] 

getattr(my_module, dct[0])() 

globals()[dct[0]]() 
1

如果您想調用的功能模塊的一部分:

import module 
getattr(module, funcname_string)(*args, **kwargs) 
1

正如其他人所說,在Python函數是第一類對象。如果您確實想從列表中獲取其名稱,則可以使用eval()(不受歡迎)或使用globals()字典。請記住,如果這些字符串來自用戶,它們非常危險。如果他們不是來自用戶,那麼不要使用字符串。

1
def do_this(): pass 
def do_that(): pass 

dct = dict((x.__name__, x) for x in [do_this, do_that]) 
# dct maps function names to the function objects 
# the names *don't* have to match the function name in your source: 
# dct = {"foo": do_this} 
# which means user-facing names can be anything you want 

dct["do_this"]() # call do_this 
相關問題