Python 复杂文本的伪造解析/评估

Python 复杂文本的伪造解析/评估,python,parsing,ieee-754,complex-numbers,Python,Parsing,Ieee 754,Complex Numbers,在计算复数时,python喜欢摆弄符号 >>> -0j (-0-0j) >>> (-0-0j) 0j 为什么? 注意:我在阅读问题时注意到了这一点。这里的问题是Python不会将复杂的数字(如(-0-0j))解析为文字,它们实际上被解析为表达式: >>> import ast >>> ast.dump(ast.parse('(-0-0j)')) 'Module(body=[Expr(value=BinOp(left=Una

在计算复数时,python喜欢摆弄符号

>>> -0j
(-0-0j)
>>> (-0-0j)
0j
为什么?


注意:我在阅读问题时注意到了这一点。

这里的问题是Python不会将复杂的数字(如
(-0-0j)
)解析为文字,它们实际上被解析为表达式:

>>> import ast
>>> ast.dump(ast.parse('(-0-0j)'))
'Module(body=[Expr(value=BinOp(left=UnaryOp(op=USub(), operand=Num(n=0)), op=Sub(), right=Num(n=0j)))])'
所以,这不是一个复数文字,而是复数和整数的一个反射减法

>>> -0-0j
0j
>>> (0j).__rsub__((0).__neg__())
0j
int部分被强制具有0j复数分量,然后由于复数分量的减法,我们失去了预期的结果。根据指令,
0j-0j
的结果应该有正号

这可以说是一个解析器问题,因为零的符号会影响方程的解。然而,这个问题在python跟踪器上一直被视为“不是一个bug”,所以这种行为看起来不会很快消失。当您关心有符号零时,初始化复数的可靠方法是调用内置的:

>>> 0-0j
0j
>>> 0+0j
0j
>>> complex(0., -0.)
-0j
>>> complex(0., +0.)
0j

这里的问题是Python不会将复杂的数字(如
(-0-0j)
解析为文字,而是将它们解析为表达式:

>>> import ast
>>> ast.dump(ast.parse('(-0-0j)'))
'Module(body=[Expr(value=BinOp(left=UnaryOp(op=USub(), operand=Num(n=0)), op=Sub(), right=Num(n=0j)))])'
所以,这不是一个复数文字,而是复数和整数的一个反射减法

>>> -0-0j
0j
>>> (0j).__rsub__((0).__neg__())
0j
int部分被强制具有0j复数分量,然后由于复数分量的减法,我们失去了预期的结果。根据指令,
0j-0j
的结果应该有正号

这可以说是一个解析器问题,因为零的符号会影响方程的解。然而,这个问题在python跟踪器上一直被视为“不是一个bug”,所以这种行为看起来不会很快消失。当您关心有符号零时,初始化复数的可靠方法是调用内置的:

>>> 0-0j
0j
>>> 0+0j
0j
>>> complex(0., -0.)
-0j
>>> complex(0., +0.)
0j