如何通过模块中的标识符名称而不是闭包中的名称来动态访问函数(由工厂创建)



如何通过字符串匹配访问函数的标识符名称,而不是闭包中的名称

我有一个名为tool_factory.py的模块

def factory(config):
def f(*arg, **kwargs):
...
return f

func_1_tool = factory(config.a1) # 
func_2_tool = factory(config.a2) # 

comsume模块的另一个文件consumeit.py上,尝试获得类似tool的函数,即func_1_toolfunc_2_tool

import inspect
import tool_factory as tool_module
istool = lambda member: inspect.isfunction(member) 
and member.__name__.endswith('_tool') # not work cause __name__ = 'f'
tools = inspect.getmembers(tool_module, istool) 
# call the tools

我尝试过通过functools.wrps使用decorator。但对于某些场景,factory是直接的、简单的、更短的(one-line风格(

更新

我有一个重新组织这些函数的方法,找到它们更简洁,但我不喜欢隐藏目的的技巧

# ugly maybe
lambda member: ... and member.__qualname__ == 'factory.<locals>.f'

有更好的解决方案或建议吗?

实际上,`getmembers((不适用于这种情况

以下是答案,请参阅jasonharper的评论

name, member in tool_module.__dict__.items(): 
#can then check member for being a function, and name for ending with "_tool".

最新更新