调用一个用户定义函数,将其名称作为字符串输入到另一个函数Python2.7

调用一个用户定义函数,将其名称作为字符串输入到另一个函数Python2.7,python,python-2.7,Python,Python 2.7,我是Python新手,使用Anaconda(编辑器:Spyder)编写了一些简单的函数。我创建了20个函数的集合,并将它们保存在单独的.py文件中(文件名与函数名相同) 比如说 def func1(X) Y=... return Y 我有另一个函数,它将函数名作为字符串(这20个函数中的一个)作为输入,调用它,进行一些计算并返回输出 def Main(String,X) Z=... W=String(Z) V=... return V 如何根据

我是Python新手,使用Anaconda(编辑器:Spyder)编写了一些简单的函数。我创建了20个函数的集合,并将它们保存在单独的
.py
文件中(文件名与函数名相同)

比如说

def func1(X)
    Y=...
    return Y
我有另一个函数,它将函数名作为字符串(这20个函数中的一个)作为输入,调用它,进行一些计算并返回输出

def Main(String,X)
    Z=...
    W=String(Z)
    V=...
    return V
如何根据字符串输入选择函数

更多详情:
Main函数计算给定函数的Sobol指数。我编写了主函数。我的同事们编写了自己的函数(每个函数可能有500多行代码),只想使用Main获取Sobol索引。我会把Main交给其他人,所以我不知道将来Main作为一个函数会得到什么。我也不想让Main的用户费心编字典。

函数是Python中的对象。这意味着您可以将它们存储在词典中。一种方法是通过将希望调用的名称存储为键,将函数存储为值来分派函数调用

例如:

import func1, func2
operation_dispatcher = {
    "func1": getattr(func1, "func1"),
    "func2": getattr(func2, "func2"),
}

def something_calling_funcs(func_name, param):
    """Calls func_name with param"""
    func_to_call = operation_dispatcher.get(func_name, None)
    if func_to_call:
        func_to_call(param)

现在可以用类似的方式自动生成调度表,但在这种情况下可能会有更好的设计(也许考虑重新组织您的导入)。 “编辑”花了我一分钟时间对其进行全面测试,因为我必须设置一些文件,如果您有许多名称要导入,并且不想在字典中手动指定每个名称,则可以执行类似操作:

import importlib
func_names = ["func1", "func2"]
operation_dispatch = {
    name : getattr(importlib.import_module(name), name)
    for name in func_names}

#usage
result = operation_dispatch[function_name](param)

注意,这假设函数名和模块名相同。这用于从这里的
func\u name
中提供的字符串中导入模块名称。

您只需要一个函数字典,如下所示:

call = {
          "func1": func1,
          "functionOne": func1,
          "func2": func2,
       }
def Main(String,X)
    Z=...
    W=call[String](Z)
    V=...
    return V
请注意,如果需要,同一个函数可以有多个键,并且只要用户输入正确的键,名称就不需要与函数完全匹配

然后您可以这样调用此函数:

call = {
          "func1": func1,
          "functionOne": func1,
          "func2": func2,
       }
def Main(String,X)
    Z=...
    W=call[String](Z)
    V=...
    return V
尽管我建议在用户无法输入有效密钥时捕获错误

def Main(String,X)
    Z=...
    try:
        W=call[String](Z)
    except KeyError:
        raise(NameError, String + " is not a valid function key")
    V=...
    return V

制作一个函数分派字典,将字符串存储为键,然后将函数存储为值。通过查找函数并将参数传递给该字典查找结果来调用。为什么它会将函数名作为字符串?函数是一级对象;只需向函数本身传递一个引用。另外,是否有理由不将所有20个函数放在一个模块中?主函数计算给定函数的Sobol索引。我编写了主函数。我的同事们编写了自己的函数(每个函数可能有500多行代码),只想使用Main获取Sobol索引。我会给其他人主要,所以我不知道我会得到什么作为一个功能在未来。我也不想让他们费心编字典。getattr(module_name,String)@akalikin更容易做。我认为它们同样复杂,因为它们只是访问函数的两种不同方式。
getattr
的一个小缺点是,它只能工作,因为OP正在导入所有内容。如果他们重构代码将它们全部放在一个文件中,那么该解决方案将不再有效。在这种情况下,f=getattr(sys.modules[name],String)。仍然省去了向字典添加函数的麻烦编辑部分解决了我的问题。谢谢请你看一下我在上述答案中的评论,看看我的问题是否提出得很好或重复?你应该编辑你的问题,尝试更多地解释用例,评论包含了问题中真正应该包含的重要信息。真正的问题似乎是自动创建一个函数分派表,从文件中提取相关函数。仅通过相关字符串调用函数的简单问题肯定是重复的。