obj[1] *and* obj['foo']

Christopher A. Craig list-python at ccraig.org
Wed Aug 7 19:01:00 CEST 2002


Jonathan Hogg <jonathan at onegoodidea.com> writes:

> The problem with subclassing list is that you end up in the dark world of
> Python C-type prototols where sequences and mappings are different things.
> The type subclassing magic fakes up what looks like a standard __getitem__
> call, except by that point it's too late and you've been forced through the
> sequence protocol and the argument must be an integer.

Subclassing list doesn't actually effect what inputs you can take in
__getitem__

Python 2.2.1 (#2, Apr 22 2002, 17:53:10) 
[GCC 2.95.4 20011002 (Debian prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo(list):
...   def __getitem__(self, key):
...     if type(key)==type(1): 
...       return list.__getitem__(self, key)
...     elif type(key)==type('a') and len(key)==1 and 'a'<=key<='z': 
...       return list.__getitem__(self, ord(key)-ord('a'))
...     else:
...       raise TypeError, "sequence index must be integer"
... 
>>> t = Foo()
>>> t.append(3)
>>> t[0]
3
>>> t['a']
3
>>> t[1.]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: sequence index must be integer


That said, if you want to use strings as indexes you probably want a
dictionary.


-- 
Christopher A. Craig <list-python at ccraig.org>
"I wouldn't be surprised if the architecture of Intel's microprocessors
were eventually linked to the eventual fall of mankind." Steve Gibson




More information about the Python-list mailing list