[Python-Dev] Should KeyError use repr() on its argument?

Guido van Rossum guido@python.org
Wed, 04 Sep 2002 07:24:16 -0400


> > > The KeyError exception doesn't apply repr() to its argument.  That's
> > > annoying in cases like this:
> > >
> > >   >>> a = {}
> > >   >>> a['']
> > >   Traceback (most recent call last):
> > >     File "<stdin>", line 1, in ?
> > >   KeyError
> > >   >>>
> > >
> > > Should this be fixed?  How?  (I guess we could add a KeyError__str__
> > > method to exceptions.c that applies repr().)
> > >
> > > I've got a feeling this is a feature, but not a very useful one.
> >
> > I take it back.  args[0] being the actual key that failed is a
> > feature.  str() not using repr() on args[0] is a bug.  I'll fix it.
> >
> 
> What is args[0]?

args is the name of the instance variable that most exceptions use to
store the arguments that were passed to them in the raise statement
(or equivalent C API).  It is a tuple.  Examples:

  >>> a = KeyError()
  >>> a.args
  ()
  >>> a = KeyError(1)
  >>> a.args
  (1,)
  >>> a = KeyError(1,2,3)
  >>> a.args
  (1, 2, 3)
  >>> try:
          {}['']
      except KeyError, k:
          print k.args

  ('',)
  >>> 

> Are you saying that dicts use repr() instead of str() to
> get the key value when accessing?

No, I'm saying that str(KeyError('foo')) should return repr('foo')
rather than 'foo' as it does now.  See current CVS. :-)

--Guido van Rossum (home page: http://www.python.org/~guido/)