What is the difference between __reduce__ and __reduce_ex__?
__reduce_ex__ is what __reduce__ should have been but never became.  __reduce_ex__ works like __reduce__ but the pickle protocol is passed.
I understand that these methods are for pickling/unpickling and have no relation to the reduce built-in function, but what's the difference between the 2 and why do we need both?