Python NotImplemented常量

Anu*_*yal 30 python

通过浏览decimal.py,它使用NotImplemented了许多特殊方法.例如

class A(object):
    def __lt__(self, a):
        return NotImplemented

    def __add__(self, a):
        return NotImplemented
Run Code Online (Sandbox Code Playgroud)

Python的文件说:

未实现

可以由"富比较"特殊方法(__eq__(),__lt__()和朋友)返回的特殊值,以指示未针对其他类型实现比较.

它没有谈论其他特殊方法,也没有描述行为.

它似乎是一个神奇的对象,如果从其他特殊方法返回引发TypeError,并在"丰富的比较"特殊方法什么也不做.

例如

print A() < A()
Run Code Online (Sandbox Code Playgroud)

打印True,但

print A() + 1
Run Code Online (Sandbox Code Playgroud)

加注TypeError,所以我很好奇发生了什么以及NotImplemented的用法/行为是什么.

Bra*_*lor 32

NotImplemented允许您指示两个给定操作数之间的比较尚未实现(而不是指示比较有效,但False两个操作数的产量).

Python语言参考:

对于对象x和y,首先x.__op__(y) 尝试.如果未实现或返回NotImplemented, y.__rop__(x)则尝试.如果这也未实现或返回NotImplemented,则引发TypeError异常.但请参阅以下异常:

前一项的异常:如果左操作数是内置类型或新样式类的实例,并且右操作数是该类型或类的正确子类的实例并覆盖基类的__rop__()方法,则右操作数的__rop__()方法在左操作数的__op__() 方法之前尝试.这样做是为了使子类可以完全覆盖二元运算符.否则,左操作数的__op__()方法将始终接受右操作数:当期望给定类的实例时,该类的子类的实例始终是可接受的.

  • 好吧,所以一般行为是如果返回值是NotImplemented尝试别的,如果不可能引发TypeError (3认同)
  • 在其他上下文中使用它是不是一个坏主意,比如,不同类型之间的字典映射? (2认同)

小智 6

它实际上有从返回时相同的含义__add____lt__,所不同的是Python的2.X试图对象放弃之前比较的其他方式.Python 3.x确实引发了TypeError.事实上,Python也可以尝试其他东西__add__,看看__radd__和(尽管我对它很模糊)__coerce__.

# 2.6
>>> class A(object):
...   def __lt__(self, other):
...     return NotImplemented
>>> A() < A()
True

# 3.1
>>> class A(object):
...   def __lt__(self, other):
...     return NotImplemented
>>> A() < A()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: A() < A()
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅订购比较(3.0 docs).