如何在Python的eval中结合f-string执行match-case语句?
问题根因
eval()仅能执行求值表达式,而match/case是Python的复合流程控制语句,不属于表达式范畴,本身就无法被eval解析运行。- 原写法用反斜杠续行拼接字符串时,生成的代码缩进不符合Python语法规范,
case块没有正确缩进为match的子代码块,即使换成exec也会报语法错误。
可运行修复代码
把eval替换为支持执行任意Python语句的exec(),同时用三引号构造格式正确的多行代码字符串,避免缩进错乱:
for i in ['int', 'bool']: code = f""" match 1: case {i}(): print(1) """ exec(code)
运行上述代码,当i='int'时会正常输出1;当i='bool'时不会触发分支,因为整数1的类型是int,不属于bool类的实例(布尔值True/False才是bool的实例)。
额外提醒
动态拼接代码用exec/eval执行有极高的安全风险,如果i的来源是外部用户输入、不可信的接口返回,很容易被构造恶意内容执行任意系统操作,生产环境尽量用字典映射、类型判断分支等更安全的方案替代这种动态语句写法。
内容的提问来源于stack exchange,提问作者apostofes
相关产品推荐
相关产品推荐

