2012-10-11 45 views
11

假設我有一個功能bar在一個名爲foo.py的模塊中。在foo.py的某處,我希望能夠從字符串「bar」中調用bar()。我怎麼做?從Python中的同一模塊內的字符串調用函數?

# filename: foo.py 
import sys 

def bar(): 
    print 'Hello, called bar()!' 

if __name__ == '__main__': 
    funcname = 'bar' 
    # Here I should be able to call bar() from funcname 

我知道python中存在一些名爲'getattr'的內置函數。但是,它需要'模塊對象'作爲第一個參數。如何獲取當前模塊的'模塊對象'?

回答

21

globals可能更容易理解。它返回當前模塊的__dict__,所以你可以這樣做:

func_I_want = globals()['bar'] #Get the function 
func_I_want() #call it 

如果你真的想要的模塊對象,你可以從sys.modules得到它(但通常並不需要它):

import sys.modules 
this_mod = sys.modules[__name__] 
func = getattr(this_mod,'bar') 
func() 

請注意,一般來說,您應該問自己爲什麼要這樣做。這將允許任何功能通過字符串調用 - 這可能是用戶輸入...如果您不小心讓用戶訪問錯誤的功能,這可能有不良的副作用。

10

使用,讓你想調用的函數映射的字典:

if __name__ == '__main__': 
    funcnames = {'bar': bar} 
    funcnames['bar']() 
+0

我始終明白,解決了OP的_problem_,而不是他/她的答案_題_。 +1 – gboffi

0

如何:

eval('bar' + '()') 
相關問題