py/objtype: Handle NotImplemented return from binary special methods.
NotImplemented means "try other fallbacks (like calling __rop__ instead of __op__) and if nothing works, raise TypeError". As MicroPython doesn't implement any fallbacks, signal to raise TypeError right away.
This commit is contained in:
50
tests/basics/class_notimpl.py
Normal file
50
tests/basics/class_notimpl.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# Test that returning of NotImplemented from binary op methods leads to
|
||||
# TypeError.
|
||||
try:
|
||||
NotImplemented
|
||||
except NameError:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
class C:
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
|
||||
def __str__(self):
|
||||
return "C(%s)" % self.value
|
||||
|
||||
def __add__(self, rhs):
|
||||
print(self, '+', rhs)
|
||||
return NotImplemented
|
||||
|
||||
def __sub__(self, rhs):
|
||||
print(self, '-', rhs)
|
||||
return NotImplemented
|
||||
|
||||
def __lt__(self, rhs):
|
||||
print(self, '<', rhs)
|
||||
return NotImplemented
|
||||
|
||||
def __neg__(self):
|
||||
print('-', self)
|
||||
return NotImplemented
|
||||
|
||||
c = C(0)
|
||||
|
||||
try:
|
||||
c + 1
|
||||
except TypeError:
|
||||
print("TypeError")
|
||||
|
||||
try:
|
||||
c - 2
|
||||
except TypeError:
|
||||
print("TypeError")
|
||||
|
||||
try:
|
||||
c < 1
|
||||
except TypeError:
|
||||
print("TypeError")
|
||||
|
||||
# NotImplemented isn't handled specially in unary methods
|
||||
print(-c)
|
||||
Reference in New Issue
Block a user