В чем разница между __reduce__ и __reduce_ex__?

Я понимаю, что эти методы предназначены для травления / распиловки и не имеют никакого отношения к сокращенной встроенной функции, но в чем разница между 2 и почему нам нужны оба?

Документы говорят, что

Если предоставлено, при времени травления __reduce__() без аргументов, и он должен возвращать либо строку, либо кортеж.

С другой стороны,

Иногда бывает полезно узнать версию протокола при реализации __reduce__ . Это можно сделать, реализовав метод __reduce_ex__ вместо __reduce__ . __reduce_ex__ , когда он существует, вызывается в предпочтении над __reduce__ (вы можете предоставить __reduce__ для обратной совместимости). Метод __reduce_ex__ будет вызываться с единственным целым аргументом – версией протокола.

На захватывающей руке Гвидо говорит, что это область, которую можно очистить.

__reduce_ex__ – это то, что __reduce__ должно было быть, но не стало. __reduce_ex__ работает как __reduce__ но протокол pickle передается.