On Sat, Dec 21, 2013 at 12:40 PM, Steven D'Aprano <st...@pearwood.info> wrote: > On Sat, Dec 21, 2013 at 08:41:17AM -0500, eryksun wrote: >> >> >>> vars(type)['__base__'] >> <member '__base__' of 'type' objects> > > Oooh, nice! I always forget about vars(), and end up messing about with > __dict__.
It's a bit more efficient to use the __dict__ attribute, but I like built-in vars(). vars(obj) is basically doing the equivalent of getattr(obj, '__dict__'), so there's that plus the overhead of the call. vars has to play it safe. A class may define a custom __dict__ property, such as the tuple subclass created by namedtuple: from collections import namedtuple Point = namedtuple('Point', 'x y') p = Point(1, 2) >>> type(vars(Point)['__dict__']) <class 'property'> >>> vars(p) OrderedDict([('x', 1), ('y', 2)]) Even if an object has a dict, it would be wrong for vars to naively return a reference. A class might be overriding __getattribute__ to create dynamic attributes or raise an AttributeError for '__dict__'. Also, bypassing the descriptor would bypass the proxy protecting a class dict, enabling silliness: from ctypes import pythonapi, py_object # 3.3+ pythonapi.PyObject_GenericGetDict.restype = py_object pythonapi.PyObject_GenericGetDict.argtypes = [py_object] str_dict = pythonapi.PyObject_GenericGetDict(str) str_dict['lower'] = str_dict['upper'] >>> 'abc'.lower() 'ABC' _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor