如何通过字符串匹配访问函数的标识符名称,而不是闭包中的名称
我有一个名为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_tool
、func_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".