Pythonインタープリター(2.7.3)が次のようになる理由を誰かが説明できますか:
>>> 5 -+-+-+ 2
3
これはこれまで役に立ちましたか? また、どのような目的で使用されていますか?
Pythonインタープリター(2.7.3)が次のようになる理由を誰かが説明できますか:
>>> 5 -+-+-+ 2
3
これはこれまで役に立ちましたか? また、どのような目的で使用されていますか?
ここを使用dis
して、式が実際にどのように評価されたかを確認できます。
In [29]: def func():
....: return 5 -+-+-+ 2
....:
In [30]: import dis
In [31]: dis.dis(func)
2 0 LOAD_CONST 1 (5)
3 LOAD_CONST 2 (2)
6 UNARY_POSITIVE
7 UNARY_NEGATIVE
8 UNARY_POSITIVE
9 UNARY_NEGATIVE
10 UNARY_POSITIVE
11 BINARY_SUBTRACT
12 RETURN_VALUE
したがって、その式は次と同等です。
In [32]: 5 - (+(-(+(-(+(2))))))
Out[32]: 3
これはちょうど等しい
5 - (+(-(+(-(+2)))))
+ と - はすべて単項演算子です。数値の場合+
、オペランドを変更せずに返します。ただし、その意味は__pos__
、独自のクラスで特別なメソッドを使用してオーバーライドできます。
__neg__
数値でこれを行うのは無意味な難読化ですが、カスタムおよび/または__pos__
操作でクラスインスタンスを使用している場合は (信じられないほど混乱する場合) 役立つ場合があります。
これを悪用して、C のようなプリインクリメント--
と++
演算子を取得できます。実際にこれを行うことはありません。
class IncrementableInteger(object):
def __init__(self, val=0):
self.val = val
def __pos__(self):
class PlusOne:
def __pos__(_self):
self.val += 1
return PlusOne()
def __neg__(self):
class MinusOne:
def __neg__(_self):
self.val -= 1
return MinusOne()
def __str__(self):
return str(self.val)
def __repr__(self):
return repr(self.val)
例:
>>> IncrementableInteger(4)
4
>>> v=_
>>> ++v
>>> v
5
コードを難読化する以外に、これに対するユーティリティはありません。
これに対する評価は次のとおりです。
5 -+-+-+ 2 = 5 -(+(-(+(-(+ 2)))))
= 5 -(+(-(+(- 2))))
= 5 -(+(-(- 2)))
= 5 -(+(+ 2))
= 5 -(+ 2)
= 5 - 2
= 3