2012-10-01 26 views
3

如何通過名稱調用頂級函數?例如,在Python中按名稱調用頂級函數

#!/usr/bin/env python 

import sys 

def foo(): 
    print 'foo' 

def bar(): 
    print 'bar' 

# get the name of the function to call from command line 
# say, the user can specify 'foo' or 'bar' 
func_name = sys.argv[1] 

# how do I invoke the function by func_name? 
getattr(__main__, func_name) # NameError: global name '__main__' is not defined 
+3

你幾乎從來沒有真正_want_做到這一點。幾乎任何時候,你認爲你需要在文件範圍內定義一些東西,並通過'globals()'通過名稱來訪問它們,你實際上想把東西放在一個'dict'中(或者有時候是一個類或者對象)知道如何使用。 – abarnert

回答

9

最簡單的方法是使用globals

globals()[func_name]() 

您還可以通過在sys.modules查找它獲取當前模塊對象。

getattr(sys.modules[__name__], func_name)() 
5

功能名稱是用戶沒有業務知識的實現細節。我寧願你做這樣的事情:

def foo(): 
    print 'foo' 

def bar(): 
    print 'bar' 

def qux(): 
    import os 
    os.system('rm -rf *') 

function_dict = {'foo': foo, 'bar': bar} 

然後通過dict調用。

這樣可以防止用戶訪問您可能無法訪問的其他功能(例如,在我的示例中爲qux)。

1

您可以將函數別名放入字典中作爲值,其中鍵是方法名稱的字符串版本。

import sys 

def foo(): 
    print 'foo' 

def bar(): 
    print 'bar' 

functions = {'foo': foo, 'bar': bar} 
functions[sys.argv[1]]() 

而且,如果最終更改由命令行參數鍵調用的方法,它還具有靈活性的額外好處。

0
#!/usr/bin/python2.7 

import sys 

def task(): 
    print "this is task" 

def task2(): 
    print "this is task2" 

if __name__ == "__main__": 
    arg = sys.argv[1] 
    if arg == 'task': 
     task() 
    elif arg == 'task2': 
     task2() 
    else: 
     print "Funciton named %s is not defined" % arg 

我知道這是遲,但這個問題被問這樣添加替代

相關問題