Python如何通过函数名字符串在运行时修改对应函数定义
错误原因
你之前的写法不生效是因为:eval_fist = eval(func_to_change) 只是把first函数的引用赋值给了新变量eval_fist,后续修改eval_fist的指向只是改变了这个临时变量的值,完全不会影响原来的first变量本身。
正确实现方案
方案1:使用全局变量字典(推荐,安全性更高)
Python中全局作用域的变量、函数都存储在globals()返回的字典里,键就是变量/函数的名字符串,直接修改这个字典的对应值即可实现目标:
def first(): print("first") def second(): print("second") func_to_change = "first" # 直接修改全局作用域中对应函数名的绑定 globals()[func_to_change] = second print(first) print(second)
运行后两个输出的函数地址完全一致,和直接写first = second的效果完全相同。
方案2:使用exec直接修改原变量(不推荐,存在代码注入风险)
如果一定要用exec实现,需要直接对目标函数名对应的变量赋值,而不是修改临时变量:
def first(): print("first") def second(): print("second") func_to_change = "first" # 直接构造赋值给目标函数名的执行语句 exec(f"{func_to_change} = second") print(first) print(second)
如果需要修改的是类的成员函数,不需要操作全局字典,直接用setattr(类实例/类对象, 函数名字符串, 新函数)即可。
内容的提问来源于stack exchange,提问作者malasteakin
相关产品推荐
相关产品推荐

