On Sat, Jul 30, 2005 at 06:41:51PM +1000, Nick Coghlan wrote: > Brett Cannon wrote: > > Don't forget this is Python 3.0; if it makes more sense we can break code. > > Or if he can be persuaded that ControlFlowException should exist as a peer of > Exception and CriticalException. . . > > >>> +-- TypeError > >>> +-- AttributeError (subclassing new) > > > > It seems a decision needs to be made as to whether the lack of an > > attribute is a failure of using the wrong type of object, just a > > failure to find something in an object, or a failure to find a name in > > a namespace. I lean towards the first one, you like the second, and > > Guido seems to like the third. $20 says Guido's opinion in the end > > will matter more than ours. =) > > I think this is a context thing - whether or not an AttributeError is a > TypeError or LookupError depends on the situation. > > In ducktyping, attributes are used to determine if the object is of the > correct type. In this case, an AttributeError indicates a TypeError.
+1 > However, it isn't that uncommon to use an instance's namespace like a > dictionary to avoid typing lots of square brackets and quotes (e.g. many > configuration handling modules work this way). In this case, an > AttributeError > indicates a LookupError. I expect any square-brackets (foo['bar'] or foo[7]) to be a LookupError or a subclass (KeyError, IndexError). If AttributeError subclassed LookupError you would have to work around it in common code where you are accessing an attribute and doing a [] lookup on the same line. class Foo(object): bar = {'k' : ['A', 'B', 'C']} try: print Foo.barrr['j'][7] # could raise AttributeError, IndexError, KeyError except (KeyError, IndexError): pass If the attribute isn't there I made a coding mistake, if the key/index isn't there my data source doesn't include that item (not a mistake, it just isn't there). > I think it's similar to the common need to convert from KeyError to > AttributeError in __getattr__ methods - the extra attributes are looked up in > some other container, and the resultant KeyError needs to be converted to an > AttributeError by the __getattr__ method. That common use case still doesn't > mean KeyError should subclass AttributeError. The top level access should dictate which error it raises, even if attributes are implemented with dictionaries. 'foo.bar' and 'foo.__dict__['bar']' look different to me, even if the results on success are frequently the same. Any chance str.index and list.index could raise IndexError instead of ValueError in 3.0? Even after a few years of using them I still get this wrong. index() isn't the same lookup as [], but my brain still slips and expects a function named "index" to raise an "IndexError" -jackdied _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com