【问题标题】:Call a function from a stored string in Python [duplicate]从Python中存储的字符串调用函数[重复]
【发布时间】:2017-07-02 19:42:21
【问题描述】:

我需要的是获取变量的东西,如果变量是函数的名称,则将调用该函数。 我不是想从模块中获取函数,而是从程序本身中获取函数

例子:

def foo():
    print("Foo")
callfunction = input("What function do you want to call? ")

callfunction() ## Not sure what to put here but but lets say callfunction is foo.

我不想要这样的东西,因为我有很多功能:

if callfunction == "Foo"
    Foo()
else:
    print("No function with that name")

我的问题类似于this,但我要求提供 Python 语法。我正在使用 Python 3.5.1

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    使用 dict 将名称映射到函数。

    call_dict = {
        'foo': foo,
        'bar': bar
    }
    call_dict[callfunction]()
    

    【讨论】:

      【解决方案2】:

      在 Python 中使用命令模式是很常见的。首先将所有函数移动到一个类中,并为它们命名,其名称具有输入中未使用的前缀。然后使用getattr()找到正确的函数并调用它。

      class Commands():
         def cmd_foo(self):
             print("Foo")
      
         def callFunction(self, name):
             fn = getattr(self, 'cmd_'+name, None)
             if fn is not None:
                  fn()
      

      与 Daniel 的 call_dict 相比,这有几个优点:您不必再次列出函数的名称,也不必再次列出可调用的函数。

      'cmd_' 前缀是为了确保您可以在类中拥有其他方法,但仍可以准确控制哪些方法可以直接调用。

      【讨论】:

        【解决方案3】:

        你可以这样做:

        eval(input("What function do you want to call? ") + '()')
        

        【讨论】:

        • 这允许使用它的人执行任意 python 代码(只要他们所做的任何事情都以可调用结尾)。例如,他们可能只是选择删除您的所有文件。
        • 我使用的是 Python 3.5.1 而不是 2.7。但这似乎是最简单的解决方案
        • 它是,因为您不使用额外的变量来存储函数名称,如果它解决了您的问题,请将答案标记为已接受。 @KalkidanTadesseZewdieBeyene
        • @Jarvis 我试过了,它工作过一次,但现在我总是得到这个 TypeError: Callfunction() missing 1 required positional argument: 'event' 即使在添加事件之后
        • @KalkidanTadesseZewdieBeyene:乍一看,这似乎是最简单的解决方案,但它是一个非常非常非常危险的解决方案。阅读Eval really is dangerous
        【解决方案4】:

        应该这样做

        import inspect
        import your_module
        
        list_of_functions = inspect.getmembers(your_module, inspect.isfunction)
        

        现在list_of_functions 是一个元组列表,每个函数的名称在位置 0,函数本身在位置 1。

        【讨论】:

          猜你喜欢
          • 2011-12-17
          • 2011-03-03
          • 2015-04-06
          • 2011-05-07
          • 1970-01-01
          • 2023-03-09
          • 2013-01-03
          • 1970-01-01
          • 2022-08-14
          相关资源
          最近更新 更多