eryksun added the comment:

Refer to the documentation for deprecated __getslice__ when slicing an instance 
of a classic class:

https://docs.python.org/2/reference/datamodel.html#object.__getslice__

The SLICE+3 implementation (apply_slice) calls PySequence_GetSlice if both 
index values can be converted to Py_ssize_t integers and if the type defines 
sq_slice (instance_slice for the "instance" type). The "instance" type is used 
for an instance of a classic class. This predates unification of Python classes 
and types.

apply_slice
http://hg.python.org/cpython/file/f89216059edf/Python/ceval.c#l4383

PySequence_GetSlice
http://hg.python.org/cpython/file/f89216059edf/Objects/abstract.c#l1995

instance_slice
http://hg.python.org/cpython/file/f89216059edf/Objects/classobject.c#l1177

A new-style class, i.e. a class that subclasses object, would have to define or 
inherit __getslice__ in order for the C sq_slice slot to be defined. But 
__getslice__ is deprecated and shouldn't be implemented  unless you have to 
override it in a subclass of a built-in type. 

When sq_slice doesn't exist, apply_slice instead calls PyObject_GetItem with a 
slice object:

    class A(object):
        def __getitem__(self, index):
            return index.start
        def __len__(self):
            return 10

    >>> A()[-1:10]
    -1

By the way, you don't observe the behavior in Python 3 because it doesn't have 
classic classes, and the __getslice__, __setslice__, and __delslice__ methods 
are not in its data model.

----------
components: +Interpreter Core -Documentation
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue21785>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to