测试exec()函数遇异常:无法获取last_trade_id数值,请求协助
解决exec()测试时无法提取
last_trade_id的问题 看起来你在测试exec()函数对接主程序的时候,踩了几个典型的坑——想从类似心跳数据里提取last_trade_id的数值,结果要么拿到None,要么输出一堆混乱的截断内容,我来帮你拆解问题并给出解决方案:
问题根源分析
你遇到的情况大概率是两个原因:
- 把JSON字符串直接丢给exec()执行:JSON的语法和Python字典不完全一致(比如JSON用双引号包裹键,而Python里直接写双引号会被当成字符串),直接执行会触发语法错误,导致代码执行不完整,变量没正确赋值,甚至输出截断的错误信息。
- exec()的变量作用域没处理好:即使代码能执行,也可能因为变量没有暴露到当前作用域,导致你后续访问时拿到
None。
正确解决方案
优先方案:用JSON解析替代exec()
exec()是执行Python代码的工具,而你处理的是JSON格式的数据,完全没必要用exec()来做这件事,直接用json模块解析更安全、更简单:
import json # 假设你的原始数据是这样的字符串 raw_data = '{"last_trade_id": 13621701, "product_id": "BTC-EUR", "sequence": 3542855617, "time": "2018-04-01T18:38:32.455000Z", "type": "heartbeat"}' # 解析成Python字典 data_dict = json.loads(raw_data) # 直接提取目标字段 last_trade_id = data_dict["last_trade_id"] print(last_trade_id) # 输出:13621701
如果必须用exec()(主程序依赖)
如果因为主程序架构必须用exec()测试,那要确保执行的是合法的Python代码,并且正确处理变量作用域:
import json raw_data = '{"last_trade_id": 13621701, "product_id": "BTC-EUR", "sequence": 3542855617, "time": "2018-04-01T18:38:32.455000Z", "type": "heartbeat"}' data_dict = json.loads(raw_data) # 用exec将目标值赋值给变量b exec('b = data_dict["last_trade_id"]') # 现在可以正常访问b了 print(b) # 输出:13621701
或者如果你想直接用字符串构造exec的代码,要先把JSON转成Python兼容的字典语法:
raw_data = '{"last_trade_id": 13621701, "product_id": "BTC-EUR", "sequence": 3542855617, "time": "2018-04-01T18:38:32.455000Z", "type": "heartbeat"}' # 把JSON的双引号替换成单引号,变成合法的Python字典代码 python_compatible_str = raw_data.replace('"', "'") # 执行代码,将数据存入字典变量 exec(f'data = {python_compatible_str}') # 提取目标字段 last_trade_id = data["last_trade_id"] print(last_trade_id)
额外提醒
exec()是一个风险较高的函数,尤其是处理外部来源的数据时,容易引发注入攻击。如果不是主程序架构强制要求,尽量用常规的变量赋值、JSON解析来替代exec(),既安全又容易维护。
内容的提问来源于stack exchange,提问作者TRV
相关产品推荐
相关产品推荐

