Python如何通过字符串形式的函数名调用父函数内的嵌套子函数
实现方案
默认嵌套在函数内部的子函数属于父函数的局部作用域变量,未主动暴露的情况下外部无法直接访问,要实现需求可参考以下两种方案:
方案1:改造为可调用类,适配点操作符调用习惯
可以完美匹配你想要的调用风格,结合getattr处理字符串形式的函数名:
class ParentFunction: def __call__(self): # 原parent_function的核心逻辑写在这里 print("父函数核心逻辑执行") def child_function(self): # 原child_function的逻辑写在这里 print("子函数逻辑执行") # 实例化后可以像普通函数一样调用,也可直接访问子函数 parent_function = ParentFunction() method_name = "child_function" # 通过getattr获取字符串对应的函数属性后调用 getattr(parent_function, method_name)()
如果是固定名称的子函数,也可以直接写parent_function.child_function()调用,和你预期的写法完全一致。
方案2:父函数返回子函数映射表,无侵入改造成本更低
如果不想调整原有父函数的实现结构,可以把需要对外暴露的子函数封装为字典返回:
def parent_function(): # 原父函数核心逻辑 print("父函数核心逻辑执行") def child_function(): # 原子函数逻辑 print("子函数逻辑执行") # 对外暴露的子函数映射 return { "child_function": child_function } method_name = "child_function" # 调用父函数获取映射表后,通过字符串key调用对应子函数 export_funcs = parent_function() export_funcs[method_name]()
原有写法报错的原因
Python中的函数虽然是支持挂载自定义属性的对象,但嵌套函数默认不会自动绑定到父函数的属性上,仅存在于父函数运行时的局部作用域中,因此直接通过parent_function.字符串变量名的方式无法读取到对应的子函数。如果不修改父函数的实现,没有常规方法可以直接访问函数内部的局部嵌套函数。
内容的提问来源于stack exchange,提问作者Varun Kao
相关产品推荐
相关产品推荐

