我有几个功能,例如:
def func1():
print 'func1'
def func2():
print 'func2'
def func3():
print 'func3'
然后我要求用户使用choice = raw_input()
输入他们想要运行的功能,并尝试使用choice()
调用他们选择的功能。如果用户输入func1而不是调用该函数,则会给出一个错误'str' object is not callable
。无论如何,他们是否可以将“选择”转变为可赎回价值?
答案 0 :(得分:8)
错误是因为函数名不是字符串,你不能调用像'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)()
答案 1 :(得分:3)
如果你制作一个更复杂的程序,那么使用Python标准库中的cmd模块比写东西更简单。
那么你的例子就是这样的:
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_
的每个函数。此外,还会自动生成帮助,您可以将参数传递给函数。
答案 2 :(得分: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