Python 2转3浮点除法符号丢失求助:eval上下文异常
解决Python 2转3中自制解释器浮点除法丢失符号的问题
首先得明确:你在标准Python3环境里测试的结果是完全正确的——int(-6)/int(3)确实会返回-2.0,这说明问题根本不在Python的除法语法本身,百分之百是你自制的简易AI解释器的eval()上下文或者解析逻辑出了岔子。
我帮你梳理几个大概率的排查方向:
检查
eval()的命名空间干扰
你有没有在给eval()传参时,自定义了globals或locals字典?比如会不会不小心重写了/运算符,或者定义了某个和除法相关的自定义函数,直接忽略了负号的处理?毕竟你提到浮点加法无此问题,说明符号处理在加法逻辑里是正常的,唯独除法环节出了问题。排查负整数的解析逻辑
你的解释器是不是有自定义的语法解析步骤?比如把输入的['-6', '3']转换成表达式字符串时,有没有把-6的负号弄丢?比如会不会误把-6拆解成6单独处理,却在除法运算时没把负号和数值绑定在一起?
你可以先在解释器里单独跑一句eval('int(-6)/int(3)'),如果结果还是2.0,那基本可以锁定是负整数解析环节出了问题。排除
set_stri等函数的影响
虽然概率不高,但还是可以确认下set_stri函数会不会在处理字符串时误删负号?比如有没有用正则或字符串处理逻辑,把开头的-当成无用字符去掉?不过你提到整数除法//的结果是正常的-2,所以这个可能性相对较低。
给你几个快速验证和修复的小步骤:
- 先把lambda表达式里的
set_stri和process_line去掉,直接在解释器里运行eval('lambda x,y: int(x)/int(y)')('-6','3'),看结果是不是-2.0。如果还是不对,那就是纯eval上下文的问题。 - 检查你生成eval表达式的代码,比如有没有把
x的值转换成字符串时,漏掉了负号?比如是不是误用到abs()之类的函数处理输入? - 如果你的解释器涉及AST(抽象语法树)处理,检查除法节点的左右操作数,确认负号有没有被正确保留在数值节点里。
内容的提问来源于stack exchange,提问作者ralphie boy
相关产品推荐
相关产品推荐

