调用用户定义的函数,将其名称作为另一个函数Python 2.7的字符串输入

时间:2015-08-14 14:10:23

标签: 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

如何根据字符串输入选择功能?

更多细节: Main函数计算给定函数的Sobol指数。我写了Main函数。我的同事们编写了自己的函数(每个函数可能超过500行代码)并且只想使用Main来获取Sobol索引。我会将Main给予其他人,所以我不知道Main将来会取得什么功能。我也不希望Main的用户经历制作字典的麻烦。

2 个答案:

答案 0 :(得分:0)

函数是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__的内容更自动地生成调度表,但在这种情况下可能有更好的设计(可能考虑重新组织您的导入)。

EDIT花了我一分钟来完全测试这个因为我必须设置一些文件,如果要导入很多名称并且不想手动指定每个文件,你可以做这样的事情。在字典中:

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)

请注意,这假定函数名称和模块名称相同。这使用importlibfunc_names这里提供的字符串中导入模块名称。

答案 1 :(得分:0)

你只想要一本功能词典,比如:

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