【问题标题】:How do I use user input to invoke a function in Python? [duplicate]如何使用用户输入在 Python 中调用函数? [复制]
【发布时间】:2013-05-13 14:10:23
【问题描述】:

我有几个功能,例如:

def func1():
    print 'func1'

def func2():
    print 'func2'

def func3():
    print 'func3'

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

【问题讨论】:

    标签: python function


    【解决方案1】:

    错误是因为函数名不是字符串你不能像'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)()
    

    【讨论】:

    【解决方案2】:

    如果您制作更复杂的程序,使用 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 手册 (here) 或 Python 3 版本的手册示例 (here)。

    【讨论】:

      【解决方案3】:

      您可以使用locals

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

      【讨论】:

      • 或更一般地说,globals
      猜你喜欢
      • 2018-09-28
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多