Benjamin Peterson wrote:
> 2009/6/15 Nick Coghlan <ncoghlan at gmail.com>:>> Guido van Rossum wrote:>>> In general, CPython isn't always consistent in raising AttributeError>>> and TypeError when it comes to such policy issues: there are various>>> places that raise TypeError in typeobject.c (and probably elsewhere)>>> that simply forbid setting a specific attribute (another example is>>> __name__).>> We're pretty inconsistent when it comes to looking up special methods as>> well - those that are looked up through dedicated slots in abstract.c>> usually raise TypeError, while those that are looked up via a PyType>> method usually raise AttributeError.> > What's a PyType method?
I was misremembering - for some reason I thought:
a) _PyObject_LookupSpecial was a PyType method
b) That it raised AttributeError itself instead of letting the caller
decide what error to raise
It's still the case that (e.g.) special_lookup() in ceval.c raises an
AttributeError, as do special method lookups from Python of the form
"type(obj).__method__(obj)".
Whether CPython raises TypeError or AttributeError when it comes to
special methods is really pretty arbitrary rather than a matter of any
grand design.
Cheers,
Nick.
P.S. If anyone feels like digging into the archives, the last time I can
recall this topic coming up is when I was concerned about the original
with statement implementation raising AttributeError rather than
TypeError when it couldn't find an __enter__ or __exit__ method. Guido
chimed in then (as now) to say that either exception was fine.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------