[Bar Harel]:
I was just about to fix dict's get() to call __missing__ if a key doesn't exist (before returning the default value) but realized that although small, that patch can cause future issues. Right now there's an inconsistency:
The reason for this inconsistency is because the Mapping abc and dict behave differently. Dict's get doesn't call __getitem__ which causes the call not to route to __missing__. MutableMapping's get calls __getitem__, which UserDict implements as a check to __missing__ as well.
Should get() call __missing__?
[Guido van Rossum]
I don't think __missing__ should be called by get() -- get() already has a way to deal with missing keys, and making it use two different mechanisms would be weird (e.g. if get() calls __missing__, is the default value ever used?).
[Ethan Furman] It could be if __missing__ refused to return a value for some particular keys. However, I don't think get() should call __missing__. [Bar Harel]
As for get(). Current implementation of UserDict returns the default value for get() if __missing__() raises KeyError. Which sounds reasonable to me. After all, you would logically expect __missing__ to be called for get() as you tried to get a non-existing value.
[Ethan Furman] I disagree. My understanding of the purpose behind get() is to get a value or return the default specified in the get() call, not to create a new key (which the default __missing__ does). -- ~Ethan~