[Python-Dev] slice subscripts for sequences and mappings (original) (raw)

Eli Bendersky eliben at gmail.com
Sat Mar 3 09:36:04 CET 2012


Hello,

I find a strange discrepancy in Python with regards to slice subscripting of objects, at the C API level. I mean things like obj[start🔚step].

I'd expect slice subscripts to be part of the sequence interface, and yet they are not. In fact, they are part of the mapping interface. For example, the list object has its slice get/set methods assigned to a PyMappingMethods struct. So does a bytes object, and pretty much every other object that wants to support subscripts.

This doesn't align well with the documentation, in at least two places.

  1. The library documentation (http://docs.python.org/dev/library/stdtypes.html) in 4.8 says:

    "Mappings are mutable objects. There is currently only one standard mapping type, the dictionary"

Why then does a list implement the mapping interface? Moreover, why does bytes, an immutable object, implement the mapping interface?

  1. The same documentation page in 4.6 says, in the operation table:

    s[i:j]     slice of s from i to j
    s[i:j:k]  slice of s from i to j with step k

But in the implementation, the slice subscripts are part of the mapping, not the sequence inteface.

The PySequenceMethods structure does have fields for slice accessors, but their naming (was_sq_slice, was_sq_ass_slice) suggests they're just deprecated placeholders.

This also doesn't align well with logic, since mappings like dict have no real meaning for slice subscripts. These logically belong to a sequence. Moreover, it takes subscripts for single a single numeric index away from subscripts for a slice into a different protocol (the former in sequence, the latter in mapping).

I realize I must be missing some piece of the history here and not suggesting to change anything. I do think that the documentation, especially in the area of the type object that defines the sequence and mapping protocols, could be clarified to express what is expected of a new type that wants to act as a sequence. In particular, it should be said explicitly that such a type must implement the mapping protocol if it wants slice subscripting.

If this makes any sense at all, I will open an issue.

Eli



More information about the Python-Dev mailing list