Problem redefining __getitem__ for str subclass

Alex Martelli aleax at mac.com
Sun Apr 22 06:56:13 CEST 2007


<tsm8015 at gmail.com> wrote:

> I do not think I am understanding how to redefine the getitem function
> for string. Why does the following not work:
> 
> class NStr(str):
>     def __getitem__(self,idx):
>         print "NStr:getitem",idx,type(idx)
>         return str.__getitem__(self,idx)
> 
> s=NStr("abcde")
> 
> print s[1]
> print s[1:4:2]
> print s[1:2]
> 
> if I run this program (python 2.5; Mac OSX) i get:
> 
> $ python strProb.py
> NStr:getitem 1 <type 'int'>
> b
> NStr:getitem slice(1, 4, 2) <type 'slice'>
> bd
> b
> 
> ie the last statement (s[1:2]) with a simple slice does not call the
> new __getitem__???? What am I missing.

For backwards compatibility, slicing without a step on some ancient
built-in types (including strings, but also lists) goes to __getslice__
(an otherwise obsolete method) instead of __getitem__.  Simply, override
__getslice__ by properly delegating from it to __getitem__.


Alex



More information about the Python-list mailing list