Hey, I like this! It's a subtle encouragement for developers to
initialize all their instance variables in their __init__ or __new__
method, with a (modest) performance improvement for a carrot. (Though
I have to admit I have no idea how you do it. Wouldn't the set of dict
keys be different while __init__ is in the middle of setting the
instance variables?)

The "type's attribute set" will be a superset of the instance's, for
a shared key set. Initializing the first instance grows the key set,
which is put into the type. Subsequent instances start out with the
key set as a candidate, and have all values set to NULL in the dict
values set. As long as you are only setting attributes that are in the
shared key set, the values just get set. When it encounters a key not
in the shared key set, the dict dissociates itself from the shared key
set.

Another question: a common pattern is to use (immutable) class
variables as default values for instance variables, and only set the
instance variables once they need to be different. Does such a class
benefit from your improvement?

It depends. IIUC, if the first instance happens to get this attribute
set, it ends up in the shared key set, and subsequent instances may have
a NULL value for the key.

I'm unsure how *exactly* the key set gets frozen. You cannot allow resizing
the key set once it is shared, as you would have to find all instances with
the same key set and resize their values. It would be possible (IIUC) to
add more keys to the shared key set if that doesn't cause a resize, but I'm
not sure whether the patch does that.

Regards,
Martin

_______________________________________________
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

Reply via email to