[Python-ideas] accurate errors for "magic" methods
Chris Rebert
pyideas at rebertia.com
Wed Apr 15 08:35:22 CEST 2009
On Fri, Apr 10, 2009 at 6:52 AM, R. David Murray <rdmurray at bitdance.com> wrote:
> Steven D'Aprano <steve at pearwood.info> wrote:
>> On Fri, 10 Apr 2009 03:56:16 am Georg Brandl wrote:
>> > spir schrieb:
>> > > Actually, I'm wrong: it's perfectly clear as long as the programmer
>> > > is able to follow all the necessary reflexion path; then probably
>> > > also able to solve the problem without any help from python.
>> > >
>> > > The issue here is that a very specific (and meaningful) case
>> > > (dict-like behaviour missing) is adressed using a very generic (and
>> > > thus helpless) message (attributeError).
>> > >
>> > > I think error cases about "magic" methods, that implement
>> > > conceptually meaningful behaviours, should have appropriate
>> > > messages. In the case above, maybe something like: "Values instance
>> > > is not an item container (no __getitem__ method found)."
>> >
>> > The time machine strikes again:
>> > >>> class A(object): pass
>> >
>> > ...
>> >
>> > >>> A()['a']
>> >
>> > Traceback (most recent call last):
>> > File "<stdin>", line 1, in <module>
>> > TypeError: 'A' object is unsubscriptable
>> >
>> >
>> > (the difference being that A is new-style, while Values is
>> > old-style.)
>>
>>
>> Except that the error "object is unsubscriptable" might as well be in
>> Klingon to most people, particularly newbies.
>>
>> (1) It's easy to misread it as "unscriptable", which is even more
>> mysterious.
>>
>> (2) As far as I know, there's no tradition of describing key or index
>> lookup as "subscripting" in Python. I've never noticed it in doc
>> strings or the online docs, and after hanging around comp.lang.python
>> extensively for years, I feel safe to say it's not a common term among
>> even experienced Python developers. I suppose that there's a weak
>> connection between index lookup and subscripts in mathematics.
>>
>> (3) The classic error message tells the newbie exactly what the error
>> is: the object has no __getitem__ method. The new error message tells
>> the newbie nothing useful. Given that obj is unsubscriptable, what
>> needs to be done to make it subscriptable?
>
> +1
>
> And not just the newbie, either. The experienced python programmer
> looks at the original message and goes "ah ha". The experienced python
> programmer looks at the new message and has to _think about it_ before
> understanding arrives. I think that would be true even if you found a
> better word than 'unsubscriptable'. "Does not implement an item lookup
> method" might work. Or how about, 'Does not implement the Sequence or
> Mapping interface'?
>
> But you know what? Doing a google search for 'python mapping' gets you
> the description of dictionaries, while doing a google search for 'python
> __getitem__' gets you to the data model chapter that describes how the
> mapping/sequence behavior is implemented via __getitem__. The latter
> is more useful even to the newbie, I think.
>
> So even if it looks ugly, I think the error message should mention
> __getitem__.
I have gone ahead and filed a bug: http://bugs.python.org/issue5760
Cheers,
Chris
--
I have a blog:
http://blog.rebertia.com
More information about the Python-ideas
mailing list