@kingfisher I'm no Python guru, so take this with a grain of salt, but it feels wrong to me to treat an empty list of keys as implicitly a list of every key.
Would it ever (EVER!) make sense to pass an empty list and expect no iteration to occur? I.e., is it possible, even if very improbable, that a caller would generate a legitimate empty list of keys and be surprised that the call iterated over the entire dictionary? If so, don't make an empty list mean "every key".
It feels like an optional parameter or a special value like "Undefined" or "None" would be better than an empty list. That way it is explicit that you are NOT passing a list.