Hm. This brings up some disconcerting side effect-related concerns; In principle, describe_mismatch is not guaranteed to be called after a _matches call. Clearly, it's necessary to call function() only once, and store the result... but matchers are historically stateless.

This isn't necessarily a dealbreaker, but I'm a bit concerned about it. I'm not sure we can merge this into the core with that assumption violated.

I recommend that you consider retaining state for the inbound callable; it will probably involve some weakref to the item itself.