I meant for defaultdicts or any object that already implements fallback defaults.
E.g. ChainMap does (3) to account for this.
But ChainMap is expected to be used with mappings and I agree that this doesn’t need to be the same.
I think leaving this to behave as (1) might be best.
If mental model is such that itemgetter calls __getitem__ and returns default on error, then all works simple and well.
attrgetter potentially has the same issue, but I don’t think there is a need to overcomplicate these.
I think these are mostly used for pre-compiled performance gain. In this case anyone who has defaultdict can “pre-compile” it to dict or employ some other strategy to do the right thing depending on a situation.