マイナスはリテラルの一部じゃなくて演算子

二乗したのに符号がマイナスなんだけど「こいつ虚数か?」と思ったら、単純に ** が先に評価されているだけでした。

>>> -1 ** 2
-1
>>> (-1) ** 2
1

よく読むと、チュートリアルにも記載されてるし。

- よりも ** の方が優先度が高いので、-3**2-(3**2) として解釈され、結果は -9 になる。こういうふうに解釈されないよう (-3)**2 にすると 9 という結果が得られる。

Since ** has higher precedence than -, -3**2 will be interpreted as -(3**2) and thus result in -9. To avoid this and get 9, you can use (-3)**2.

https://docs.python.org/3/tutorial/introduction.html#id3

きっとあまりにも間違える人が多いので、わざわざ注意書きしてあるんでしょうね。なんかすいません。

そもそも - ってリテラルの一部じゃなくて演算子なのね。-1 を ast で分解させるとこの通り。

>>> import ast
>>> ast.dump(ast.parse('-1'))
'Module(body=[Expr(value=UnaryOp(op=USub(), operand=Num(n=1)))])'

つまり、こういうことです。

class SmileParty:
    def __neg__(self):
        return 'ネガティブから'
    def __pos__(self):
        return 'ポジティブに'

s = SmileParty()
print(-s)
print(+s)
print('切り替える')

www.youtube.com