调用一个用户定义函数,将其名称作为字符串输入到另一个函数Python2.7
我是Python新手,使用Anaconda(编辑器:Spyder)编写了一些简单的函数。我创建了20个函数的集合,并将它们保存在单独的调用一个用户定义函数,将其名称作为字符串输入到另一个函数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 如何根据
.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)。仍然省去了向字典添加函数的麻烦编辑部分解决了我的问题。谢谢请你看一下我在上述答案中的评论,看看我的问题是否提出得很好或重复?你应该编辑你的问题,尝试更多地解释用例,评论包含了问题中真正应该包含的重要信息。真正的问题似乎是自动创建一个函数分派表,从文件中提取相关函数。仅通过相关字符串调用函数的简单问题肯定是重复的。