有人可以解释为什么 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
它是这样解释的:
5 - (+(-(+(-(+2)))))
你可以写-a
得到否定的a
。为了对称和“为什么不呢?” 您还可以使用加号前缀,例如+a
.
添加多个符号并不是很有用,但它是允许的,可能是因为它恰好在语法中是合法的,没有人认为需要明确禁止它。