9

我有几个功能,例如:

def func1():
    print 'func1'

def func2():
    print 'func2'

def func3():
    print 'func3'

然后我要求用户输入他们想要运行choice = raw_input()的函数并尝试调用他们选择使用的函数choice()。如果用户输入 func1 而不是调用该函数,它会给我一个错误,说'str' object is not callable. 无论如何,我是否可以将“选择”转化为可调用的值?

4

3 回答 3

11

错误是因为函数名称不是字符串,您不能像'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)()
于 2013-05-18T14:41:58.080 回答
4

如果您制作一个更复杂的程序,使用 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_. 还会自动生成帮助,您可以将参数传递给函数。

有关这方面的更多信息,请查看 Python 手册(此处)或示例手册的 Python 3 版本(此处)。

于 2013-05-18T14:59:39.630 回答
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
于 2013-05-18T14:39:24.197 回答