【问题标题】:Calling a function from a set variable? [duplicate]从集合变量调用函数? [复制]
【发布时间】:2013-12-31 18:24:07
【问题描述】:

我正在编写一个 python 脚本,我想做的是将输入捕获到一个变量中,然后使用它来调用具有该名称的函数。这是一个例子:

def test():
    print "You want to do a test!"

option = raw_input("What do you want to do? ") #User types in test
option()

现在这不起作用,因为 python 没有将选项视为变量,而是试图调用函数“选项”。这样做的最糟糕的方法是什么?

【问题讨论】:

    标签: python


    【解决方案1】:

    您希望非常小心地运行任意代码,但如果您绝对需要,您可以使用eval() 函数。

    更好的方法可能是为您的用户提供一个选项菜单,然后对 option 的内容进行测试以查看他们选择了哪个,然后运行该功能。

    【讨论】:

    • 嗯,很有趣。所以我们要做的是基本上拥有一个交互式外壳,并根据用户输入的内容,一个函数将根据输入运行。因此,如果用户键入 ls,它将运行一个列出来自 api 的文件的函数。现在我们有 if input == "ls": do funtion 我想拥有它,这样我就可以添加一个新函数而无需大量的 if 语句。我只是想知道是否有人有更简单的想法。
    • 你不需要大量的if语句,你总是可以将函数名存储在一个列表中,然后if option in list: ...
    • 我喜欢,这是个好主意。不过我也喜欢蒂姆·彼得斯。我认为它会很好用,剩下的唯一一件事就是找出一个全部(如果命令不是作为函数找到)和具有多个选项的命令(?,h,帮助都指向一个函数),但这可能很容易通过尝试/例外完成。感谢您的帮助!
    【解决方案2】:

    您可以使用 python eval

    在帮助页面中,eval 在全局变量和局部变量的上下文中评估源代码。源代码可以是表示 Python 表达式的字符串,也可以是 compile() 返回的代码对象。

    例如:

     def a():
         print "Hello"
    
     inp = raw_input()
     eval(inp + "()")
    

    在标准输入输入a 时,函数a 将被执行。请注意,如果不进行任何安全检查,这可能会很危险。

    【讨论】:

      【解决方案3】:

      我想这是裸 input 的实际用途:

      option = input("What do you want to do? ") #User types in test
      option()
      

      这在语义上等同于eval(raw_input())。请注意,在 python 3 中,raw_input 变为 input,因此您必须明确地 eval 它。

      此类操作的常见警告非常不安全。但我认为这从您要求用户访问运行任意代码的要求中很明显,所以......

      【讨论】:

        【解决方案4】:

        eval() 可以,但正如@MattDMo 所说,这可能很危险。

        如果您的函数是模块全局变量,则这样做更安全:

        globals()[option]()
        

        globals() 是一个字典,将字符串映射到这些字符串绑定到的模块全局对象。所以globals()[option] 在该字典中查找绑定到option 的字符串,并返回对象;例如,globals["test"] 返回test() 的函数对象。然后在末尾添加() 调用该函数对象。宾果游戏 - 你完成了。

        【讨论】:

        • 很好,我忘记了...
        • 太棒了!我认为那是赢家!现在我所需要的只是找出接受多个输入并捕获所有内容的函数,但我认为我可以通过 try/except 来做到这一点。感谢您的帮助!
        【解决方案5】:

        我喜欢在这种情况下使用字典。如果用户提供了非预期的答案,您甚至可以指定默认选项。

        def buy_it():
            print "use it"
        
        def break_it():
            print "fix it"
        
        def default():
            print "technologic " * 4
        
        menu = {"buy it": buy_it, "break it": break_it}
        option = raw_input("What do you want to do? ")
        menu.get(option, default)()
        

        【讨论】:

          猜你喜欢
          • 2018-05-19
          • 2020-01-10
          • 2011-03-23
          • 2015-10-25
          • 1970-01-01
          • 2021-11-18
          • 1970-01-01
          • 2016-11-30
          • 2022-11-26
          相关资源
          最近更新 更多