如何用Python变量值作为回调函数名调用第三方lottery函数?
解决方案
由于无法修改第三方的lottery函数,我们需要将动态生成的函数名字符串转换为对应的函数对象,再传入作为回调。以下是两种可行的实现方式:
方法一:通过全局命名空间获取函数
如果回调函数是全局定义的,可以直接用globals()根据字符串获取函数对象:
def lottery(amount, callback=None): print(f'You spent {amount} on a lottery ticket.') if callback: callback(amount) def win(amount): print(f'You won ${amount * 1000}!!!') def lose(amount): print(f"Sorry, you spent {amount} and didn't win anything.") def win_1(amount): print(f'You won special prize ${amount * 2000}!!!') # 动态生成函数名字符串 index = 1 callback_name = 'win_' + str(index) # 将字符串转为函数对象 callback_func = globals()[callback_name] # 传入lottery调用 lottery(100, callback_func)
执行后输出:
You spent 100 on a lottery ticket. You won special prize $200000!!!
方法二:使用字典映射函数(更安全)
提前将所有可能用到的回调函数存入字典,通过字符串键来获取对应函数,这种方式能避免全局命名空间的潜在风险,也更可控:
def lottery(amount, callback=None): print(f'You spent {amount} on a lottery ticket.') if callback: callback(amount) def win(amount): print(f'You won ${amount * 1000}!!!') def lose(amount): print(f"Sorry, you spent {amount} and didn't win anything.") def win_1(amount): print(f'You won special prize ${amount * 2000}!!!') def lose_1(amount): print(f"Sorry, you spent {amount} and got a consolation prize.") # 构建函数映射字典 callback_map = { 'win': win, 'lose': lose, 'win_1': win_1, 'lose_1': lose_1 } # 动态生成目标函数名 index = 0 callback_name = 'win' + (f'_{index}' if index != 0 else '') # 从字典中取出函数对象 callback_func = callback_map[callback_name] # 调用lottery lottery(100, callback_func)
执行后输出:
You spent 100 on a lottery ticket. You won $100000!!!
注意事项
- 使用
globals()时,要确保目标函数确实存在于全局命名空间中,否则会触发KeyError - 字典映射的方式更适合函数数量多、或函数分布在不同作用域的场景,能有效避免同名函数冲突的问题
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

