Python中不使用eval执行字典字符串的实现方案
不用eval实现f-string字符串的执行
问题原因
你之前用replace或strip处理双引号无效,是因为交互界面显示的双引号只是Python标记字符串的符号,并非data['param']的实际内容。实际存储的内容是f'sometext({FROMDATE})',开头是f'、结尾是'。
方法一:手动提取模板+变量替换
这是最简单的方案,适合格式固定的场景:
FROMDATE = 22061988 data = {'param': "f'sometext({FROMDATE})'"} # 提取f-string内部的模板(去掉开头的f'和结尾的') template = data['param'].removeprefix("f'").removesuffix("'") # 兼容Python 3.8以下版本的写法:template = data['param'][2:-1] # 替换模板中的变量占位符 # 方式1:用format+当前环境变量 result = template.format(**locals()) # 方式2:直接替换单个变量(更直观,如果只有一个变量的话) # result = template.replace("{FROMDATE}", str(FROMDATE)) print(result) # 输出: sometext(22061988)
方法二:用ast模块解析(安全适配复杂场景)
如果你的f-string包含多个变量或复杂表达式,手动替换容易出错,可借助ast模块解析执行(比直接eval原始字符串更安全):
import ast FROMDATE = 22061988 data = {'param': "f'sometext({FROMDATE})'"} # 解析字符串为AST语法树节点 expr_node = ast.parse(data['param'], mode='eval').body # 编译并执行,传入当前环境的变量 result = eval(compile(ast.Expression(expr_node), '', mode='eval'), locals()) print(result) # 输出: sometext(22061988)
内容的提问来源于stack exchange,提问作者Srinivas Gadi
相关产品推荐
相关产品推荐

