2011-02-27 58 views
2

您能從用戶輸入調用函數嗎?類似這樣的:來自用戶輸入的Python調用函數

def testfunction(function): 
    function() 

a = raw_input("fill in function name: " 
testfunction(a) 

所以如果你填寫一個現有的函數,它會執行它。

回答

2

是的,你可以,雖然這通常是一個壞主意和一個很大的安全風險。

def testfunc(fn): 
    fn() 

funcname = raw_input('Enter the name of a function') 
if callable(globals()[funcname]): 
    testfunc(globals()[funcname]) 
3

你在做什麼壞壞壞:P然而,這是完全可能的。

a = raw_input("Fill in function name:") 
if a in locals().keys() and callable(locals()['a']): 
    locals()['a']() 
else: 
    print 'Function not found' 

locals()返回所有的對象目前avalible,他們的名字的字典。所以當我們說a in locals().keys()我們說,「是否有任何對象叫」。如果存在,我們通過執行locals()['a']來獲取它,然後使用callable測試它是否是函數。如果這是True,那麼我們稱之爲函數。如果不是,我們只需打印"Function not found"

2

我可能會封裝這種行爲的一類:

class UserExec(object): 
    def __init__(self): 
     self.msg = "hello" 
    def get_command(self): 
     command = str(raw_input("Enter a command: ")) 
     if not hasattr(self, command): 
      print "%s is not a valid command" % command 
     else: 
      getattr(self, command)() 
    def print_msg(self): 
     print self.msg 
a = UserExec() 
a.get_command() 

正如其他人所說,這是一個安全風險,但更多的控制,你必須在輸入,風險就越少是;把它放在一個包括仔細的輸入審查幫助的類中。

+0

這個程序是否具體版本? Python 3.x看起來有什麼不同? – 2016-12-28 19:04:34

+0

@ArashHowaida有點不同,但它是基本的東西,沒有任何意外的或不尋常的 - 在這種情況下,只需要'print'和'raw_input'需要改變。我總是建議人們熟悉它們之間的區別[這裏](https://docs.python.org/3/whatsnew/3.0.html)。 – senderle 2016-12-28 21:25:10