我想這樣做:在Python中動態調用函數的方式是什麼?
dct = ['do_this', 'do_that']
dct[0]() // call do_this
但你不能調用字符串的函數(會得到一個錯誤)。
如何在不切換的情況下實現這一點,並且不使用lambdas或函數列表?
顯式地我想通過名稱來引用函數。
我想這樣做:在Python中動態調用函數的方式是什麼?
dct = ['do_this', 'do_that']
dct[0]() // call do_this
但你不能調用字符串的函數(會得到一個錯誤)。
如何在不切換的情況下實現這一點,並且不使用lambdas或函數列表?
顯式地我想通過名稱來引用函數。
函數是第一類對象。所以像這樣的:
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
函數是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()
上正確的模塊可以是一個痛苦。
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')()
您可以使用getattr
,如果他們在如果它們位於全局命名空間中,則爲模塊或globals()
:
dct = ['do_this', 'do_that']
getattr(my_module, dct[0])()
globals()[dct[0]]()
如果您想調用的功能模塊的一部分:
import module
getattr(module, funcname_string)(*args, **kwargs)
正如其他人所說,在Python函數是第一類對象。如果您確實想從列表中獲取其名稱,則可以使用eval()
(不受歡迎)或使用globals()
字典。請記住,如果這些字符串來自用戶,它們非常危險。如果他們不是來自用戶,那麼不要使用字符串。
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
現在看來很明顯,謝謝。 我更喜歡你對Frédéric's的回答,因爲'import this'的eval部分 – 2010-10-25 21:49:22
+1, – Zooba 2010-11-02 02:34:14