You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python parser模块expr等方法已弃用,曲线拟合库适配求替代方案

适配Python 3.10+的曲线拟合库解决方案

原代码依赖的parser模块在Python 3.10中已被移除,以下是针对四个弃用方法的替代方案,同时保留整数转浮点数的核心逻辑:

核心替换思路

parser模块的旧方法本质是对表达式字符串进行语法树解析-修改-重新编译的流程,Python官方推荐使用ast模块完成相同工作,以下是对应步骤的逐一替换:

1. 替换parser.expr(stringToConvert)

原方法作用:将表达式字符串解析为语法树(AST)节点。
替换为ast.parse并指定mode='eval',获取单个表达式的AST节点:

import ast

# 原代码:st = parser.expr(stringToConvert)
tree = ast.parse(stringToConvert, mode='eval').body

2. 替换st2list+自定义递归修改+sequence2st

原流程作用:将AST转为可修改的列表结构,递归替换整数为浮点数,再转回AST。
直接使用ast.NodeTransformer遍历并修改AST节点,无需转列表,更符合现代Python规范:

class IntToFloatTransformer(ast.NodeTransformer):
    def visit_Constant(self, node):
        # 将整数常量节点替换为浮点数节点
        if isinstance(node.value, int):
            return ast.Constant(value=float(node.value), kind=node.kind)
        return node

# 原代码:
# stList = parser.st2list(st)
# stList = self.RecursivelyConvertIntStringsToFloatStrings(stList)
# st = parser.sequence2st(stList)

transformer = IntToFloatTransformer()
modified_tree = transformer.visit(tree)
ast.fix_missing_locations(modified_tree)  # 修复节点位置信息,避免编译报错

注:该Transformer会遍历AST中所有整数常量,将其转为浮点数,与原RecursivelyConvertIntStringsToFloatStrings逻辑完全一致。

3. 替换parser.compilest(st)

原方法作用:将AST节点编译为可复用的代码对象,提升后续eval性能。
替换为内置compile函数:

# 原代码:self.userFunctionCodeObject = parser.compilest(st)
self.userFunctionCodeObject = compile(modified_tree, '<user_expression>', mode='eval')

完整替换后代码

import ast

class IntToFloatTransformer(ast.NodeTransformer):
    def visit_Constant(self, node):
        if isinstance(node.value, int):
            return ast.Constant(value=float(node.value), kind=node.kind)
        return node

# convert integer use such as (3/2) into floats such as (3.0/2.0)
tree = ast.parse(stringToConvert, mode='eval').body
transformer = IntToFloatTransformer()
modified_tree = transformer.visit(tree)
ast.fix_missing_locations(modified_tree)

# later evals re-use this compiled code for improved performance
# in EvaluateCachedData() methods
self.userFunctionCodeObject = compile(modified_tree, '<user_expression>', mode='eval')

关键说明

  • ast模块是Python官方维护的语法分析工具,从Python 2.6开始引入,完全替代已弃用的parser模块,兼容性和稳定性更强。
  • 若原RecursivelyConvertIntStringsToFloatStrings有更复杂的逻辑(如处理变量名或特殊表达式),可扩展IntToFloatTransformer的visit_*方法实现对应修改。

内容的提问来源于stack exchange,提问作者Fausto Arinos Barbuto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:10:25