# ticket: 561 # tag: py2 # This file tests the behavior of special methods under Python 2 # after #561. (Only methods whose behavior differs between Python 2 and 3 # are tested here; see special_methods_T561.pyx for the rest of the tests.) __doc__ = u""" >>> vs0 = VerySpecial(0) VS __init__ 0 >>> vs1 = VerySpecial(1) VS __init__ 1 >>> # Python 3 does not use __cmp__. >>> vs0_cmp = vs0.__cmp__ >>> vs0_cmp(vs1) VS __cmp__ 0 1 0 >>> # Python 3 does not use __div__ or __idiv__. >>> vs0_div = vs0.__div__ >>> vs0_div(vs1) VS __div__ 0 1 >>> vs0_idiv = vs0.__idiv__ >>> vs0_idiv(vs1) VS __idiv__ 0 /= 1 >>> vs0_rdiv = vs0.__rdiv__ >>> vs0_rdiv(vs1) VS __div__ 1 0 >>> # Python 3 does not use __oct__ or __hex__. >>> vs0_oct = vs0.__oct__ >>> vs0_oct() VS __oct__ 0 >>> vs0_hex = vs0.__hex__ >>> vs0_hex() VS __hex__ 0 >>> # Python 3 does not use __nonzero__; if you define a __nonzero__ >>> # method, Cython for Python 3 would give you a __bool__ method >>> # instead. >>> vs0_nonzero = vs0.__nonzero__ >>> vs0_nonzero() VS __nonzero__ 0 False >>> # If you define __next__, you get both __next__ and next (this behavior >>> # is unchanged by T561, but only happens in Python 2) >>> vs0_next = vs0.__next__ >>> vs0_next() VS next/__next__ 0 >>> vs0_next2 = vs0.next >>> vs0_next2() VS next/__next__ 0 >>> # Cython supports getslice only for Python 2. >>> vs0_getslice = vs0.__getslice__ >>> vs0_getslice(13, 42) VS __getslice__ 0 13 42 >>> # Cython supports setslice and delslice only for Python 2. >>> # If you define either setslice or delslice, you get wrapper objects >>> # for both methods. (This behavior is unchanged by #561.) >>> ss_setslice = SetSlice().__setslice__ >>> ss_setslice(13, 42, 'foo') SetSlice setslice 13 42 'foo' >>> ss_delslice = SetSlice().__delslice__ >>> ss_delslice(13, 42) Traceback (most recent call last): ... NotImplementedError: 2-element slice deletion not supported by special_methods_T561_py2.SetSlice >>> ds_setslice = DelSlice().__setslice__ >>> ds_setslice(13, 42, 'foo') Traceback (most recent call last): ... NotImplementedError: 2-element slice assignment not supported by special_methods_T561_py2.DelSlice >>> ds_delslice = DelSlice().__delslice__ >>> ds_delslice(13, 42) DelSlice delslice 13 42 >>> sds_setslice = SetDelSlice().__setslice__ >>> sds_setslice(13, 42, 'foo') SetDelSlice setslice 13 42 'foo' >>> sds_delslice = SetDelSlice().__delslice__ >>> sds_delslice(13, 42) SetDelSlice delslice 13 42 >>> # Python 3 does not use __long__. >>> Ll = Long().__long__ >>> Ll() Long __long__ """ cdef class VerySpecial: cdef readonly int value def __init__(self, v): self.value = v print "VS __init__ %d" % self.value def __getslice__(self, a, b): print "VS __getslice__ %d %d %d" % (self.value, a, b) def __next__(self): print "VS next/__next__ %d" % self.value def __nonzero__(self): print "VS __nonzero__ %d" % self.value def __oct__(self): print "VS __oct__ %d" % self.value def __hex__(self): print "VS __hex__ %d" % self.value def __cmp__(self, other): print "VS __cmp__ %d %d" % (self.value, other.value) def __div__(self, other): print "VS __div__ %d %d" % (self.value, other.value) def __idiv__(self, other): print "VS __idiv__ %d /= %d" % (self.value, other.value) cdef class SetSlice: def __setslice__(self, a, b, value): print "SetSlice setslice %d %d %r" % (a, b, value) cdef class DelSlice: def __delslice__(self, a, b): print "DelSlice delslice %d %d" % (a, b) cdef class SetDelSlice: def __setslice__(self, a, b, value): print "SetDelSlice setslice %d %d %r" % (a, b, value) def __delslice__(self, a, b): print "SetDelSlice delslice %d %d" % (a, b) cdef class Long: def __long__(self): print "Long __long__"