2013-05-18 65 views
4

我有幾個功能,如:如何使用用戶輸入來在Python中調用函數?

def func1(): 
    print 'func1' 

def func2(): 
    print 'func2' 

def func3(): 
    print 'func3' 

然後我問他們想用choice = raw_input()運行,並嘗試調用他們選擇使用choice()的功能是什麼功能的用戶輸入。如果用戶輸入func1而不是調用該函數,它會給我一個錯誤,說'str' object is not callable。他們無論如何都會將「選擇」變成可調用的價值嗎?

回答

1

您可以使用locals

>>> def func1(): 
...  print 'func1 - call' 
... 
>>> def func2(): 
...  print 'func2 - call' 
... 
>>> def func3(): 
...  print 'func3 - call' 
... 
>>> choice = raw_input() 
func1 
>>> locals()[choice]() 
func1 - call 
+1

或更一般地說,OP的'globals' – shx2

6

這個錯誤是因爲函數名不是你不能調用函數像'func1'()字符串應該是func1()

你可以這樣做:

{ 
'func1': func1, 
'func2': func2, 
'func3': func3, 
}.get(choice)() 

它通過映射字符串到函數引用

側面說明:你可以編寫一個默認功能:

def notAfun(): 
    print "not a valid function name" 

和改善你的代碼,如:

{ 
'func1': func1, 
'func2': func2, 
'func3': func3, 
}.get(choice, notAfun)() 
+0

:它將是[**運行時多態性**]的示例(http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29#Subtype_polymorphism_。 28or_inclusion_polymorphism.29)!在Python –

3

如果你犯了一個更加複雜的程序它可能是簡單的使用CMD來自Python標準庫的模塊,而不是寫一些東西。
你的榜樣會再看看這樣:

import cmd 

class example(cmd.Cmd): 
    prompt = '<input> ' 

    def do_func1(self, arg): 
     print 'func1 - call' 

    def do_func2(self, arg): 
     print 'func2 - call' 

    def do_func3(self, arg): 
     print 'func3 - call' 

example().cmdloop() 

和實例會議將是:

<input> func1 
func1 - call 
<input> func2 
func2 - call 
<input> func3 
func3 - call 
<input> func 
*** Unknown syntax: func 
<input> help 

Undocumented commands: 
====================== 
func1 func2 func3 help 

當您使用該模塊都會被調用名爲do_*功能,當用戶輸入的名稱,而不do_。還會自動生成一個幫助,您可以將參數傳遞給函數。

有關此外觀的Python手冊(​​)或示例(here)的手冊的Python 3版本的更多信息。

+0

+驚人的!謝謝:) –

+0

+1 for cmdloop() –

相關問題