调用一个名为字符串的用户定义函数作为另一个函数python2.7的输入

2024-09-27 20:20:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如

def func1(X)
    Y=...
    return Y

我还有另一个函数,它将函数名作为字符串(这20个函数之一)作为输入,调用它,进行一些计算并返回输出。你知道吗

def Main(String,X)
    Z=...
    W=String(Z)
    V=...
    return V

如何根据字符串输入选择函数?你知道吗

更多详细信息: 主函数计算给定函数的Sobol指数。我写了主函数。我的同事编写自己的函数(每个函数可能有500多行代码),只想使用Main来获取Sobol索引。我会把Main给其他人,所以我不知道将来Main作为一个函数会得到什么。我也不希望Main的用户经历编字典的麻烦。你知道吗


Tags: 文件函数字符串pystringreturnmain文件名
2条回答

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

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

函数是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)

现在可以使用^{}之类的工具更自动地生成分派表,但是在这种情况下可能有更好的设计(也许可以考虑重新组织导入)。你知道吗

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中提供的字符串导入模块名。你知道吗

相关问题 更多 >

    热门问题