Python闭包make_currency调用convert方法时lambda未生效问题求助
问题根因
原代码的convert逻辑直接复用了set_value对应的处理函数,没有执行传入的转换lambda表达式,仅修改了货币符号,金额值未做任何计算更新。
修复后完整代码
def make_currency(val, sym): def dispatch(message): if message == 'get_value': def get_value(msg): if msg == 'amount': return val elif msg == 'symbol': return sym return get_value if message == 'set_value': def set_value(msg, value): nonlocal val nonlocal sym if msg == 'amount': val = value elif msg == 'symbol': sym = value return set_value # 单独处理convert逻辑 if message == 'convert': def convert(converter_func, new_sym): nonlocal val, sym # 执行传入的lambda转换金额 val = converter_func(val) # 更新货币符号 sym = new_sym return convert return '{0}{1:.2f}'.format(sym,val) return dispatch c = make_currency(10.50,'$') print(c('get_value')('amount')) print(c('get_value')('symbol')) c('set_value')('amount',50) print(c('get_value')('amount')) print(c('str')) c('convert')(lambda x: x*3.87, '₪') print(c('str'))
核心修改点
- 拆分
convert与set_value的逻辑分支,不再共用处理函数 - 新增
convert专属处理函数,接收转换lambda和新货币符号两个参数,先使用当前金额值执行lambda得到转换后的新金额,再更新货币符号 - 最后输出字符串时添加
.2f格式化,保证金额固定保留两位小数,符合货币输出习惯
修改后运行输出完全符合预期:
10.5 $ 50 $50 ₪193.50
内容的提问来源于stack exchange,提问作者dandon
相关产品推荐
相关产品推荐

