With this change, passing something other than a dict raises an exception, which is better than silently returning False for something that's a programming error and not a logic error.

Passing an empty dict can be done on purpose, and the method should indicate that nothing was set. If I were doing this from scratch, I'd not even set a LOGIC error, but I think this is a middle ground of sorts considering the rest of the API (I don't really like pulling the error/success state from a separate object, but changing that will be very invasive to the library and I chose to just live with it).