操作数之间的多个运算符

Sha*_*rp3 5 python

有人可以解释为什么Python解释器(2.7.3)给出以下内容:

>>> 5 -+-+-+ 2

3
Run Code Online (Sandbox Code Playgroud)

这有用吗,出于什么目的?

Ash*_*ary 10

您可以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        
Run Code Online (Sandbox Code Playgroud)

所以表达式相当于:

In [32]: 5 - (+(-(+(-(+(2))))))
Out[32]: 3
Run Code Online (Sandbox Code Playgroud)


nne*_*neo 6

这等于

5 - (+(-(+(-(+2)))))
Run Code Online (Sandbox Code Playgroud)

除了第一个之外的所有+和 - 都是一元运算符.对于数字,+返回操作数不变.但是,可以使用__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)
Run Code Online (Sandbox Code Playgroud)

例:

>>> IncrementableInteger(4)
4
>>> v=_
>>> ++v
>>> v
5
Run Code Online (Sandbox Code Playgroud)

  • 那么,除了混淆之外它真的没用? (2认同)